如何删除 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 中的单行注释(例如“// 删除此注释”)?的主要内容,如果未能解决你的问题,请参考以下文章

删除 Eclipse 中单行注释中多余的前导空格

PHP笔记

SQL/Regex Challenge/Puzzle:如何从 SQL 代码中删除注释(通过使用 SQL 查询)?

Java注释

从源文件中删除所有注释(单行/多行)和空行[重复]

python中的注释