【问题标题】:Minification: Using regex to remove linebreaks from JavaScript code缩小:使用正则表达式从 JavaScript 代码中删除换行符
【发布时间】:2014-04-05 12:46:20
【问题描述】:

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

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

【问题讨论】:

  • 对 2 的回答:是的,使用适当的 JS 压缩器。 Google 的 Closure Compiler 是我最后检查的最好的。

标签: javascript php regex minify


【解决方案1】:

剖析所有四个正则表达式

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

第一个正则表达式

$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; &lt;space&gt;&lt;space&gt;,那么表达式将匹配; 空白字符。这里的替换模式是$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 在 cmets 中指出的那样,您确实应该使用适当的 JS minifier 来完成这项任务。你可能想看看Google's Closure Compiler - 它看起来很整洁。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2019-02-16
    • 2013-11-06
    • 2011-05-23
    • 2011-12-23
    • 2010-10-22
    • 1970-01-01
    相关资源
    最近更新 更多