繁体   English   中英

如何使用PHP从Javascript中删除注释

[英]How to strip comments from Javascript using PHP

我想从以下类型的脚本中删除注释:

var stName = "MyName"; //I WANT THIS COMMENT TO BE REMOVED
var stLink = "http://domain.com/mydomain";
var stCountry = "United State of America";

什么是使用PHP完成此操作的(最佳)方法?

最好的方法是使用实​​际的解析器或自己编写至少一个词法分析器。
Regex的问题在于,如果您必须考虑所有因素,它将变得非常复杂。
例如, Cagatay Ulubay建议的Regex's /\\/\\/[^\\n]?//\\/\\*(.*)\\*\\//将匹配注释,但它们还将匹配更多内容, 喜欢

var a = '/* the contents of this string will be matches */';
var b = '// and here you will even get a syntax error, because the entire rest of the line is removed';
var c = 'and actually, the regex that matches multiline comments will span across lines, removing everything between the first "/*" and here: */';
/*
   this comment, however, will not be matched.
*/

尽管字符串不太可能包含此类序列,但内联正则表达式确实存在问题:

var regex = /^something.*/; // You see the fake "*/" here?

当前作用域很重要,除非您从头开始逐字符解析脚本,否则您可能无法知道当前作用域。
因此,您基本上需要构建一个词法分析器。
您需要将代码分为三个不同的部分:

  • 普通代码,您需要再次输出,并且注释的开始位置可能只有一个字符。
  • 评论,您将其丢弃。
  • 文字,您也需要输出,但是注释不能开始。

现在,我唯一能想到的文字是字符串(单引号和双引号),内联正则表达式和模板字符串(反引号),但这些可能并非全部。
当然,您还必须考虑这些文字中的转义序列,因为您可能会遇到内联正则表达式,例如

/^file:\/\/\/*.+/

其中基于单字符的词法分析器只能看到正则表达式/^file:\\/并且错误地将以下/*.+解析为多行注释的开头。
因此,在遇到第二个/ ,您必须回头查看并确认传递的最后一个字符是否为\\ 字符串的所有引号也是如此。

我会选择preg_replace()。 假设所有注释都是单行注释(//在此处注释),则可以从以下内容开始:

$JsCode = 'var stName = "MyName isn\'t \"Foobar\""; //I WANT THIS COMMENT TO BE REMOVED
var stLink = "http://domain.com/mydomain"; // Comment
var stLink2 = \'http://domain.com/mydomain\'; // This comment goes as well
var stCountry = "United State of America"; // Comment here';

$RegEx = '/(["\']((?>[^"\']+)|(?R))*?(?<!\\\\)["\'])(.*?)\/\/.*$/m';
echo preg_replace($RegEx, '$1$3', $JsCode);

输出:

var stName = "MyName isn't \"Foobar\""; 
var stLink = "http://domain.com/mydomain"; 
var stLink2 = 'http://domain.com/mydomain'; 
var stCountry = "United State of America"; 

此解决方案远非完美,并且其中包含“ //”的字符串可能会出现问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM