缩小:使用正则表达式从 JavaScript 代码中删除换行符
Minification: Using regex to remove linebreaks from JavaScript code
混淆的纯粹目的,前三行似乎很好地清理了不必要的输入。
谁能告诉我第 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 中删除一行或多行输入?
析所有四个正则表达式
让我们尝试剖析每个正则表达式。
第一个正则表达式
$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在评论中指出的那样,您确实应该使用适当的JS简化器来完成此任务。你可能想看看谷歌的闭包编译器 - 它看起来很整洁。
如果您仍然对它的工作原理感到困惑,请不要担心。一开始学习正则表达式可能很困难。我建议你使用这个网站 - http://regularexpressions.info。它是学习正则表达式的一个相当不错的资源。如果你正在寻找一本书,你可能想看看Jeffrey Friedl的掌握正则表达式。
- 如何从rails中的代码中删除新行( )
- 解析云代码作业:删除在数据库中已经存在一个小时的行
- Javascript/JQuery删除代码中的父TR问题
- 使用Google闭包编译器调试代码删除
- 改进js代码以删除全局变量和函数
- javascript代码,用于删除firefox中的空白,但在IE和chrome中无法正常工作
- 如何在 JavaScript 中使用正则表达式从颜色代码中删除“#”
- 使用 Javascript 动态删除行.我的代码有什么问题
- 通过找到一种删除许多 if 语句的方法来简化代码
- 从此代码中删除 Jquery
- 如何删除DOM事件处理程序的重复JavaScript代码
- 如何从此代码笔中删除数字和秒文本
- JavaScript-Regex删除代码/特殊字符/数字等
- 用于删除数组中的零的Javascript函数代码
- 删除alert()后,代码的行为会很奇怪
- 删除方法中的冗余代码
- Sharepoint 2010-停止不安全的代码删除
- 我确认后如何修改代码删除项目
- 谷歌闭包编译器-基于外部的死代码删除
- 通过云代码删除解析文件