剖析所有四个正则表达式
让我们试着剖析每一个正则表达式。
第一个正则表达式
$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,这意味着带有空格的字符串将被第一个捕获组([}])(只是分号)捕获的内容替换,然后是关键字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 的著作。