我想使用正则表达式从我的代码中删除所有单行注释(例如//comments
)。
到目前为止我正在使用:preg_replace('/\/\/(.*)/','',$html);
但它也删除了http://example.com
等字符串。
答案 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;
}