【问题标题】:How to remove single line comments in php (eg "// remove this comment")?如何删除 php 中的单行注释(例如“// 删除此注释”)?
【发布时间】: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 的答案。基本上是一样的。

标签: php regex comments


【解决方案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;        
        }
        

        【讨论】:

          猜你喜欢
          • 2012-07-05
          • 1970-01-01
          • 1970-01-01
          • 2013-10-30
          • 2012-10-15
          • 2022-12-22
          • 2023-03-12
          • 2011-07-23
          • 2016-07-25
          相关资源
          最近更新 更多