正则表达式匹配PHP评论

时间:2009-07-27 17:23:34

标签: php regex comments

我一直试图使用正则表达式匹配PHP评论。

//([^<]+)\r\n

多数民众赞成,但它确实无效。

我也试过

//([^<]+)\r
//([^<]+)\n
//([^<]+)

......无济于事

4 个答案:

答案 0 :(得分:1)

你在用什么程序编写这个正则表达式?如果您担心换行符不起作用,那么您的最后一个例子是一个很好的理智检查。 (我不知道为什么你不允许少于你的评论;我假设这是你的申请特定的。)

尝试

//[^<]+

看看是否有效。正如德拉蒙所说,你可能不得不逃离对角线。您可能还必须逃避括号。我不知道你是否知道这一点,但是括号通常用于包含捕获组。最后,检查双斜线后是否确实至少有一个字符。

答案 1 :(得分:1)

要匹配评论,您必须认为PHP 5中有两种类型的评论:

  • //开头并转到行尾的评论
  • /*开头并转到*/
  • 的评论

考虑到你首先拥有这两行:

$filePath = '/home/squale/developpement/astralblog/website/library/HTMLPurifier.php';
$str = file_get_contents($filePath);

您可以将第一个匹配:

$matches_slashslash = array();
if (preg_match_all('#//(.*)$#m', $str, $matches_slashslash)) {
    var_dump($matches_slashslash[1]);
}

第二个:

$matches_slashstar = array();
if (preg_match_all('#/\*(.*?)\*/#sm', $str, $matches_slashstar)) {
    var_dump($matches_slashstar[1]);
}

但是你可能会遇到字符串//中间的“(what about heredoc syntax, btw, did you think about that one ? )”或“切换评论”这样的麻烦:

/*
echo 'a';
/*/
echo 'b';
//*/

(如果您不知道诀窍,只需在开头添加斜线“切换”两个块)

所以......很难用正则表达式来检测评论...


另一种方法是使用 PHP Tokenizer ,它显然知道如何解析PHP代码和注释。

有关参考资料,请参阅:

有了这个,你必须在你的PHP代码字符串上使用tokenizer,迭代你得到的所有标记,并检测哪些是注释。

这样的事可能会这样做:

$tokens = token_get_all($str);

foreach ($tokens as $token) {
    if ($token[0] == T_COMMENT
        || $token[0] == T_DOC_COMMENT) {
        // This is a comment ;-)
        var_dump($token);
    }
}

而且,作为输出,你将获得这样的东西列表:

array
  0 => int 366
  1 => string '/** Version of HTML Purifier */' (length=31)
  2 => int 57

或者这个:

array
  0 => int 365
  1 => string '// :TODO: make the config merge in, instead of replace
' (length=55)
  2 => int 117

(您“只是”可能会删除///* */,但这取决于您;至少,您已经提取了评论^^)

如果你真的想要检测注释而没有任何由于“奇怪”语法引起的奇怪错误,我认为这将是要走的路; - )

答案 2 :(得分:0)

你可能需要逃避“//”:

\/\/([^<]+)

答案 3 :(得分:0)

这将匹配PHP中的注释(/ * * /和//格式)

/(\/\*).*?(\*\/)|(\/\/).*?(\n)/s

要获取所有匹配项,请使用preg_match_all获取匹配数组。