正则表达式匹配 PHP 注释

Posted

技术标签:

【中文标题】正则表达式匹配 PHP 注释【英文标题】:Regex Match PHP Comment 【发布时间】:2010-11-14 10:32:36 【问题描述】:

我一直在尝试使用正则表达式匹配 php cmets。

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

这就是我得到的,但它并没有真正起作用。

我也试过

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

……没用

【问题讨论】:

可以提供更多关于您想要实现的目标的信息,您要匹配的语言是什么来自 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

要匹配 cmets,你必须认为 PHP 5 中有两种类型的 cmets:

//开头并到行尾的cmets 以/* 开头并转到*/ 的cmets

首先考虑到这两行:

$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 ? ) 中间出现'//',或者像这样的“toggle cmets”:

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

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

所以... 仅使用正则表达式很难检测 cmets...


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

有关参考,请参阅:

token_get_all List of Parser Tokens

这样,您将不得不在您的 PHP 代码字符串上使用标记器,迭代您获得的所有标记,并检测哪些是 cmets。

这样的事情可能会做:

$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

(您“只是”可能会剥离 ///* */,但这取决于您;至少,您已经提取了 cmets ^^)

如果你真的想检测 cmets 而不会因为“奇怪”的语法而出现任何奇怪的错误,我想这就是要走的路 ;-)

【讨论】:

【参考方案3】:

您在哪个程序中编写此正则表达式?如果您担心换行符不起作用,您的最后一个示例是一个很好的完整性检查。 (我不知道您为什么不允许在您的评论中使用小于;我假设这是特定于您的应用程序的。)

试试

//[^<]+

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

【讨论】:

【参考方案4】:

您可能需要转义“//”:

\/\/([^<]+)

【讨论】:

它只匹配一条评论。它不会在文档中找到它们 你没有要求那个。但这没有任何意义。正则表达式仅适用于 line(一般而言)。如果你通过这个正则表达式传递每一行,那么它可能会做你想要的。你到底想做什么?

以上是关于正则表达式匹配 PHP 注释的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配 MySQL 注释

(php) 正则表达式删除注释但忽略字符串中的出现

正则表达式去除 HTML 注释

正则表达式匹配所有注释 //, /* */

正则表达式匹配代码块的注释

用于匹配单行和多行注释的 Python 正则表达式。