缩小:使用正则表达式从 JavaScript 代码中删除换行符

Minification: Using regex to remove linebreaks from JavaScript code

本文关键字:代码 删除 换行符 JavaScript 正则表达式 缩小      更新时间:2023-09-26
出于

混淆的纯粹目的,前三行似乎很好地清理了不必要的输入。

  1. 谁能告诉我第 1 - 4 行实际上做了什么?我从反复试验中唯一知道的是,如果我注释掉第四行,网站就可以工作了,如果我把它留在原地,网站就会中断。

    <?php
    header("Content-type: text/javascript; charset=UTF-8");   
    ob_start("compress"); 
    function compress($buffer) 
    {
        # remove extra or unneccessary new line from javascript
        $buffer = preg_replace('/([;])'s+/', '$1', $buffer);
        $buffer = preg_replace('/([}])'s+(else)/', '$1else', $buffer);
        $buffer = preg_replace('/([}])'s+(var)/', '$1;var', $buffer);
        $buffer = preg_replace('/([{};])'s+('$)/', '$1'$', $buffer);
        return $buffer;
    }
    
  2. 有没有更好的方法可以从 JavaScript 中删除一行或多行输入?

析所有四个正则表达式

让我们尝试剖析每个正则表达式。

第一个正则表达式

$buffer = preg_replace('/([;])'s+/', '$1', $buffer);

解释

(      # beginning of the first capturing group
 [;]   # match the literal character ';'
)      # ending of the first capturing group
's+    # one or more whitespace characters (including newlines)

上面的正则表达式删除紧跟在分号之后出现的任何空格。 ([;])是一个捕获组,这意味着如果找到匹配项,它将被存储到反向引用中,以便我们稍后使用它。例如,如果我们的字符串是foo; <space><space>,则表达式将匹配;空格字符。这里的替换模式是$1,这意味着整个匹配的字符串将只用一个分号替换。

<小时 />

第二个正则表达式

$buffer = preg_replace('/([}])'s+(else)/', '$1else', $buffer);

解释

(      # beginning of the first capturing group
 [}]   # match the literal character ';'
)      # ending of the first capturing group
's+    # one or more whitespace characters
(else) # match and capture 'else'

上面的正则表达式删除了右大括号 (}) 和 else 之间的任何空格。这里的替换模式是 $1else ,这意味着,带有空格的字符串将被第一个捕获组捕获的内容替换 ([}])(只是分号),后跟关键字 else 。没什么大不了的。

<小时 />

第三个正则表达式

$buffer = preg_replace('/([}])'s+(var)/', '$1;var', $buffer);

解释

(      # beginning of the first capturing group
 [}]   # match the literal character ';'
)      # ending of the first capturing group
's+    # one or more whitespace characters
(var)  # match and capture 'var'

这与以前的正则表达式相同。这里唯一的区别是关键字 - var而不是else .分号字符在 JavaScript 中是可选的。但是,如果你想在一行中编写多个语句,解释器就无法知道它们是多行的,因此需要使用;来终止每个语句。

<小时 />

第四个正则表达式

$buffer = preg_replace('/([{};])'s+('$)/', '$1'$', $buffer);

解释

(      # beginning of the first capturing group
 [{};] # match the literal character '{' or '}' or ';'
)      # ending of the first capturing group
's+    # one or more whitespace characters
(      # beginning of the second capturing group
 '$    # match the literal character '$'
)      # ending of the second capturing group

这里的替换模式是$1'$,这意味着整个匹配的字符串将被替换为第一个捕获组([{};])后跟文字$字符匹配的内容。

旁注

这个答案只是为了解释四个正则表达式及其作用。表达式可以改进很多,但我不会深入讨论,因为这不是正确的方法。正如Qtax在评论中指出的那样,您确实应该使用适当的JS简化器来完成此任务。你可能想看看谷歌的闭包编译器 - 它看起来很整洁。

如果您仍然对它的工作原理感到困惑,请不要担心。一开始学习正则表达式可能很困难。我建议你使用这个网站 - http://regularexpressions.info。它是学习正则表达式的一个相当不错的资源。如果你正在寻找一本书,你可能想看看Jeffrey Friedl的掌握正则表达式。