【问题标题】:Replacing comments in php with preg_replace用 preg_replace 替换 php 中的注释
【发布时间】:2014-03-06 15:46:43
【问题描述】:

我需要用 php.ini 中的 preg_replace() 替换所有块 cmets。 例如:

/**asdfasdf
fasdfasdf*/
echo "hello World\n";

为此:

echo "hello World\n";

我尝试了该站点的一些解决方案,但没有一个适合我。 我的代码:

$file  = file_get_contents($fileinput);
$file = preg_replace('/\/\*([^\\n]*[\\n]?)*\*\//', '', $file);
echo $file;

例如,我的输出与输入相同。Link to my regex test

【问题讨论】:

  • 我知道,但这对我来说不正确.. 例如,如果我有 echo"/*asdfasdf*/" 它将删除它并且输出将类似于 echo""
  • @JakubBaskiGabčo:那么请编辑您的问题并清楚地解释所有要求。
  • 这对 preg_replace 来说可能不是一个好工作——因为 PHP 不是一种常规语言,你会遇到字符串输入和输出的 cmets 问题。您可以接近,但您真正想要的可能是某种 PHP 标记器,它将向您发出 COMMENT_START 和 COMMENT_END 标记。

标签: php regex


【解决方案1】:

使用http://www.php.net/manual/en/function.token-get-all.php

$file  = file_get_contents($fileinput);
$tokens = token_get_all($file); // prepend an open tag if your file doesnt have one

$plain = '';
foreach ($tokens as $token) {
    if (is_array($token)) {
        list($number, $string) = $token;
        if (!in_array($number, [T_OPEN_TAG, T_COMMENT])) { // add all tokens you dont want
             $plain .= $string;
        }
    } else {
        $plain .= $token;
    }
}
print_r($plain);

输出:

 echo "hello World\n";

这里是所有 PHP 令牌的列表:

http://www.php.net/manual/en/tokens.php

【讨论】:

    【解决方案2】:

    试试这个

    $file = preg_replace('/^\s*?\/\*.*?\*\//m', '', $file);
    

    【讨论】:

      【解决方案3】:

      解析 PHP 代码的最佳方法是使用分词器。

      但是,使用正则表达式并不难。您只能跳过所有字符串:

      $pattern = <<<'EOD'
      ~
      (?(DEFINE)
          (?<sq> ' (?>[^'\\]++|\\{2}|\\.)* ' )   # single quotes
          (?<dq> " (?>[^"\\]++|\\{2}|\\.)* " )   # double quotes
          (?<hd> <<< \s* (["']?)(\w+)\g{-2} \R .*? (?<=\n) \g{-1} ;? (\R|$) ) # heredoc like
          (?<string> \g<sq> | \g<dq> | \g<hd>)
      )
      \g<string> (*SKIP)(*FAIL) | /\* .*? \*/
      ~xs
      EOD;
      
      $result = preg_replace($pattern, '', $data);
      

      【讨论】:

      • 您能否将其转换为一行正则表达式,因为我不知道该怎么做?你也可以修复它吗?不适用于单行注释 (// ...)。谢谢。
      • @ValentinTanasescu:评论不是提问的地方。此外,没有什么需要解决的,因为问题是如何删除块 cmets,而不是单行 cmets。
      猜你喜欢
      • 2010-12-18
      • 2011-07-20
      • 2014-10-08
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多