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

时间:2014-04-05 12:46:20

标签: javascript php regex minify

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

  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中删除一行或多行?

1 个答案:

答案 0 :(得分:5)

解剖所有四个正则表达式

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

第一个正则表达式

$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,这意味着,具有空格的字符串将被第一个捕获组([}])(仅仅是分号)捕获的内容替换,后跟关键字{{1} }。没什么。


第三个正则表达式

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。 JavaScript中的分号字符是<​​strong>可选。但是如果你想在一行中编写多个语句,那么解释器就无法知道它们是多行,因此需要使用else来终止每个语句。


第四个正则表达式

;

<强>解释

$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 minifier 来完成这项任务。您可能想查看Google's Closure Compiler - 它看起来非常整洁。

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