PHP Regex排除发现错误抑制的注释

时间:2014-12-29 21:32:52

标签: php regex pcre perldoc

我试图做一个正则表达式来查看一个预先存在的代码库,它似乎在变量引用和函数调用上滥用了php错误抑制字符(@)。因此,我想搜索整个代码库以创建所有用法的列表。问题是,大部分代码还包括perldoc,我不确定如何排除明显的评论。

大多数perldoc似乎都是由最小的whitespace-asterix-whitespace来预测的。 e.g:

  /**
   * @param int $somvar
   */

所以它可以合理地与/^\s*\*\s+/匹配。

我正在使用的正则表达式用于查找错误抑制字符的用法(但同时也抓住了perldoc):

/(@[\$\w][\w\d]*)/

除了拿起所有的perldoc之外,它的结果令人满意。

我试着看一些负面预测的例子,但似乎并没有用我曾尝试过的任何东西来回避那些perldoc评论。一个不起作用的例子如下:

(?!\s*[\*\/])(@[\$\w][\w\d]*)

感谢任何帮助

1 个答案:

答案 0 :(得分:1)

您可以使用PHP token_get_all()查找所有@符号而不是正则表达式。通过这种方式,您可以让PHP自己的内部解析器为您解析文件:

$source_file = 'source_file_to_open.php';
$source = file_get_contents($source_file);
$tokens = token_get_all($source);

// Loop through all the tokens
for ($i=0; $i < count($tokens); $i++) {
    // If the token is equal to @, then get the line number (3rd value in array)
    // of the *following* token because the @ does not have a line number because
    // it's not listed as an array, just a string.
    if ($tokens[$i] == '@') {
        echo "@ found in $source_file on line: {$tokens[$i+1][2]}<br />\n";
    }
}