对于混淆的纯粹目的,前三行似乎很好地清理了不必要的输入脚本。
谁能告诉我第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;
}
有没有更好的方法可以从JavaScript中删除一行或多行?
答案 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。