Sam*_*Sam 1 javascript php regex minify
对于混淆的纯粹目的,前三行似乎很好地清理了不必要的进入脚本.
任何人都可以告诉我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)有没有更好的方法从JavaScript中删除一行或多行?
让我们尝试剖析每个正则表达式.
第一个正则表达式
$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.它是学习正则表达式的相当不错的资源.如果您正在寻找一本书,您可能需要查看杰弗里弗里德的掌握正则表达式.
| 归档时间: |
|
| 查看次数: |
1090 次 |
| 最近记录: |