如何删除 php 中的单行注释(例如“// 删除此注释”)?
Posted
技术标签:
【中文标题】如何删除 php 中的单行注释(例如“// 删除此注释”)?【英文标题】:How to remove single line comments in php (eg "// remove this comment")? 【发布时间】:2011-07-22 02:34:53 【问题描述】:我想使用正则表达式从我的代码中删除所有单行 cmets(例如 //comments
)。
现在我正在使用:preg_replace('/\/\/(.*)/','',$html);
,但它也会删除像 http://example.com
这样的字符串。
【问题讨论】:
那你用什么ob_start
?只需打开文件,进行替换并保存即可?
正则表达式需要忽略 ://
而不是 //
。
如果你能在其他东西上使用正则表达式可靠地做到这一点,而不仅仅是琐碎的代码,那真的会让我感到惊讶。
我正在 wordpress 中开发一个压缩插件。我想在加载时缩小所有代码。所以不能手动删除//cmets
如果你想做对,看看 php 的内置标记器:php.net/manual/de/book.tokenizer.php 编辑:刚刚看到 nickf 的答案。基本上是一样的。
【参考方案1】:
也许更好的方法是使用 PHP 引擎本身,也许是使用token_get_all()
。该函数将对 PHP 脚本进行标记,因此您可以完全按照 PHP 的方式查看它,从而删除或替换 cmets。
仅使用正则表达式执行此操作充其量只是一场噩梦,而且很可能根本不可能。
【讨论】:
实际上,这是唯一有用的方法。 +1【参考方案2】:你不能可靠地做到这一点。不能保证文件中任何位置的//
表示 PHP 上下文中的注释。例如,它很可能包含在字符串中。
只能通过一些让步来解决这个问题。例如,如果它在一行中捕获 // comments
就足够了,那么这将是一个误报较少的选项:
$source = preg_replace('#^\s*//.+$#m', "", $source);
真正的解决方案是使用语言解析器,但这显然是矫枉过正。因此,请尝试添加一些启发式方法以避免删除错误的出现。
【讨论】:
使用heredoc和nowdoc字符串语法会失败:-S 类似这样的:window.location.href = '//' + 主机名 + url;将变为 window.location.href =【参考方案3】:如果您没有其他选择,我可以建议您。尽管在性能方面它不是最好的方法。
$lines = explode("\n", $source);
$lines = array_map(
function($line)
return preg_replace("@\s*//.*$@", '', $line);
,
$lines
);
$source = implode("\n", $lines);
【讨论】:
【参考方案4】: preg_replace('/.*?:?(\/\/.*)/','',$html);
您可以尝试这样的事情,但我相信您可以安全地使用正则表达式来解决所有可能的边缘情况。
不过,如上所述,使用分词器是一种更好、更可靠的方法。事实上,在 php.net 手册页的 cmets see here 中有一个如何从 PHP 文件中删除 cmets 的示例。这可以作为一个很好的起点,但我建议自己测试一下。 php.net 手册页上的 cmets 中的代码通常有点狡猾。
【讨论】:
【参考方案5】:如果你想缩小你的 PHP 代码,为什么不使用php_strip_whitespace( )?
【讨论】:
【参考方案6】: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;
【讨论】:
以上是关于如何删除 php 中的单行注释(例如“// 删除此注释”)?的主要内容,如果未能解决你的问题,请参考以下文章