【发布时间】:2011-05-11 13:29:57
【问题描述】:
我很难让这个正则表达式工作。我要做的就是删除块 cmets。这是我到目前为止所拥有的,但我无法摆脱最终的*/。
$string = 'this is a test /*asdfa */ ok then';
$pattern = '/\/\*([^\*\/]*)/i';
$replacement = '';
echo preg_replace($pattern, $replacement, $string);
//this is a test */ ok then
任何帮助将不胜感激。
【问题讨论】:
-
PHP 不是常规语言,因此无法解析它或使用正则表达式删除所有有效的块 cmets。
-
@Paul:你不能用正则表达式解析 PHP,但是你可以用词法分析它就好了。不需要一个成熟的解析器来摆脱 cmets(实际上,通常 cmets 在词法分析中被丢弃,而不是解析)
-
@Billy 不,你不能。 en.wikipedia.org/wiki/Chomsky_hierarchy
-
我是第一个不鼓励将正则表达式用于他们无法处理的任务的人。但是 C 风格的注释 可以 被正则表达式识别(并且例如剥离),因为它们不能嵌套(这在 PHP 和其他很多地方都是一样的)。
/* a /* b */ echo 'see?'; */会“看到?” (或者更确切地说,解析器拒绝它是因为最终的*/,这仍然证明了这一点。顺便说一句,SO 语法突出显示正确。 -
见这个例子
" this is a comment /* or is it? */"。字符串中的注释是否应该被删除?想让它更复杂吗?引入一些heredoc。