2011-03-02 79 views
1

我想decomment我// comments在我的JavaScript和PHP的preg_replace(),并提出了其的preg_replace应该做以下几点:如何使用此preg_replace解除JavaScript代码注释?

1.当一个新行注释开始,删除整行: // COMMENTS .....

2.当评论是半路脚本后面,后1个TAB //删除注释部分 exampleScript(); // (1space) comments

3.不要匹配HTTP //的://

这pregr eplace做了上述工作,然而,它目前删除3行代码//在其中。(请参阅下面的错误匹配标题),它应该跳过。

$buffer = preg_replace('/(?<!http:)\/\/\s*[^\r\n]*/', '', $buffer); 

良好匹配

//something

// something *!&[email protected]#^hjksdhaf

功能(); // comment

错误匹配

(/\/\.\//) 
"//" 
"://" 

所以,我怎么能过滤这三个错误的匹配出来,如何更改下面的正则表达式?

(?<!http:)\/\/\s*[^\r\n]* 

PS,我不希望使用别人的代码缩小器/框架与自己的开销。现在就是我自己的。

回答

6

为什么不使用预先存在的JavaScript缩小器,如YUI Compressor(PHP绑定here)?


如果你真的设置写自己的,必须通过source code看看,看看它是如何做。
简版:正确的方法是使用适当的解析器/标记器方法。

+0

感谢对此事发表评论,但我真的想用我自己的东西了现在 – Sam 2011-03-02 03:06:30

+2

@Sam:如果我问为什么,你介意吗?你使用这个作为一个学习项目吗?否则,这听起来像[NIH综合征](http://en.wikipedia.org/wiki/Not_Invented_Here#In_computing)给我。 – 2011-03-02 03:09:15

+0

第一个:我正在学习,现在在我的崇拜新手时代。我一定是IHBLRIA-man:'发明在这里,但是让我们重新创造它' – Sam 2011-03-02 03:29:31

6

JavaScript的语法是一个上下文无关语法(我相信它是LL(1)可分解的)。 它不能用正则表达式进行分析。

在可计算性理论中的形式语言理论中,有一个结果被称为抽象引理,它证明了你不能用正则表达式解析任意上下文无关文法。

问题的要点是:你不能只查找字符串//,因为它可能包含在其他有效的代码中,例如,一个字符串。你不能只在两个引号内寻找//,因为那样你会得到像alert('no!') // can't do it这样的误报,其中文字) // can在技术上被包含在两个'之间。相反,你必须检测字符串开始和结束的位置。更糟糕的是,一种类型的字符串可以嵌套在另一种类型的字符串中,而字符串(甚至是半开放的字符串)可以嵌套在注释中!

没有简单的通用解决方案 - 像字符串,括号,圆括号等JavaScript语法元素可以任意嵌套多层。准确检测任何句法元素开始和结束的唯一方法是正确解析您可能会遇到的句法元素。

正确的答案是使用实际的解析器。

+0

感谢丹尼尔或者这样有趣的定理。这使我的整个方法成为一个笑话,未来的方式。 (现在,它仍然完美无缺地工作) – Sam 2011-03-02 03:59:33