我使用以下REGEXP:
$output = preg_replace( "/\/\/(.*)\\n/", "", $output );
代码效果很好但是,当像(http://this_is_not_a_comment.com/kickme)这样的网址时,代码会替换它......(http://)< / p>
如果不替换这些网址,您可以做些什么。
谢谢,
答案 0 :(得分:8)
您需要一个能够区分代码和注释的正则表达式。特别是,由于//
的序列可以是字符串或注释,您只需要区分字符串和注释。
以下是可能执行此操作的示例:
/(?:([^\/"']+|\/\*(?:[^*]|\*+[^*\/])*\*+\/|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')|\/\/.*)/
在将匹配的字符串替换为第一个子模式的匹配项时,在替换函数中使用此函数应该能够删除//
样式注释。
一些解释:
[^/"']+
匹配任何不是评论开头的字符(//…
和/*…*/
)或字符串/\*(?:[^*]|\*+[^*/])*\*+/
与/* … */
样式评论"(?:[^"\\]|\\.)*"
匹配双引号中的字符串'(?:[^'\\]|\\.)*'
匹配单引号中的字符串\/\/.*
最终匹配//…
样式评论。由于前三个构造在一个捕获组中分组,因此匹配的字符串可用,并且在使用第一个子模式的匹配替换匹配的字符串时不会更改任何内容。仅当匹配//…
样式注释时,第一个子模式的匹配为空,因此它被空字符串替换。
但请注意,这可能会失败。我不太确定它是否适用于任何输入。
答案 1 :(得分:4)
$output = preg_replace( "/(?<!\:)\/\/(.*)\\n/", "", $output );