如何删除php中的单行注释(例如“//删除此注释”)?

时间:2011-03-24 12:33:22

标签: php regex comments

我想使用正则表达式从我的代码中删除所有单行注释(例如//comments)。

到目前为止我正在使用:preg_replace('/\/\/(.*)/','',$html);但它也删除了http://example.com等字符串。

6 个答案:

答案 0 :(得分:8)

也许更好的方法是使用PHP引擎本身,也许使用token_get_all()。该函数将标记PHP脚本,因此您可以在PHP查看时完全查看它,从而删除或替换注释。

单独用正则表达式做这件事最多只是一场噩梦,而且很可能根本不可能。

答案 1 :(得分:3)

你不能可靠地做到这一点。无法保证文件中任何位置的//表示PHP上下文中的注释。例如,它可能包含在字符串中。

只有通过一些让步才能实现这一目标。例如,如果它在单行上捕获// comments就足够了,那么这将是一个误报率较低的选项:

$source = preg_replace('#^\s*//.+$#m', "", $source);

真正的解决方案是使用语言解析器,但这显然有点过分。因此,请尝试添加一些启发式方法,以避免删除错误的信息。

答案 2 :(得分:1)

 preg_replace('/.*?:?(\/\/.*)/','',$html);

您可以尝试这样的方法,但我确信您可以安全地使用正则表达式来解释所有可能的边缘情况。

然而,如上所述,使用标记化器是一种更好,更可靠的方法。事实上,有一个如何在php.net手册页see here的注释中从PHP文件中删除注释的示例。这可以作为一个很好的起点,但我建议你自己测试一下。在php.net手册页的评论中的代码通常有点狡猾。

答案 3 :(得分:0)

如果您想缩小PHP代码,为​​什么不使用php_strip_whitespace( )

答案 4 :(得分:0)

如果你没有得到任何其他选择,我可以建议。虽然表现明智,但这不是最好的方法。

$lines = explode("\n", $source);
$lines = array_map(
  function($line) {
    return preg_replace("@\s*//.*$@", '', $line);
  },
  $lines
);
$source = implode("\n", $lines);

答案 5 :(得分:0)

function stripPhpComments($code)
{
    $tokens = token_get_all($code);
    $strippedCode = '';

    while($token = array_shift($tokens)) {        
        if((is_array($token) && token_name($token[0]) !== 'T_COMMENT') 
            || !is_array($token)) 
        {
            $strippedCode .= is_array($token) ? $token[1] : $token;
        }
    }
    return $strippedCode;        
}