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

Sam*_*Sam 1 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;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 有没有更好的方法从JavaScript中删除一行或多行?

Ama*_*ali 5

解剖所有四个正则表达式

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

第一个正则表达式

$buffer = preg_replace('/([;])\s+/', '$1', $buffer);
Run Code Online (Sandbox Code Playgroud)

说明

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

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


第二个正则表达式

$buffer = preg_replace('/([}])\s+(else)/', '$1else', $buffer);
Run Code Online (Sandbox Code Playgroud)

说明

(      # 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'
Run Code Online (Sandbox Code Playgroud)

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


第三个正则表达式

$buffer = preg_replace('/([}])\s+(var)/', '$1;var', $buffer);
Run Code Online (Sandbox Code Playgroud)

说明

(      # 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'
Run Code Online (Sandbox Code Playgroud)

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


第四个正则表达式

$buffer = preg_replace('/([{};])\s+(\$)/', '$1\$', $buffer);
Run Code Online (Sandbox Code Playgroud)

说明

(      # 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
Run Code Online (Sandbox Code Playgroud)

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

边注

这个答案只是为了解释四个正则表达式及其作用.表达式可以改进很多,但我不会进入那个,因为它不是正确的方法.正如Qtax在评论中指出的那样,你真的应该使用一个合适的JS minifier来完成这个任务.您可能想查看Google的Closure Compiler - 它看起来非常整洁.

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