2009-07-27 81 views
0

我一直在尝试使用正则表达式来匹配PHP注释。正则表达式匹配PHP评论

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

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

香港专业教育学院还试图

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

...无济于事

+2

可以使用关于您想要实现的内容的更多信息,以及与*匹配*的语言。 – Draemon 2009-07-27 17:31:00

回答

0

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

\/\/([^<]+) 
+0

虽然它只匹配一个评论。它不会在文档中找到它们 – 2009-07-27 17:31:23

1

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

尝试

//[^<]+ 

,看看是否可行。正如Draemon说的,你可能不得不逃离对角线。您可能还必须跳过括号。我不知道你是否知道这一点,但括号经常用于包含捕获组。最后,检查双斜线后是否至少有一个字符。

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'; 
//*/ 

(只是在被添加斜线gining以“拨动”两大块,如果你不知道的伎俩)

所以......很防不胜防的意见,只有正则表达式...


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

对于参考,请参阅:

有了这一点,你将不得不使用标记生成器在您的PHP代码串,重复所有你得到的令牌作为结果,并检测哪些是评论。

像这样的事情可能会做:

$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 

(你“只是”可能剥离///* */,但这是 由你决定 ;至少,你已经提取了意见^^)

如果你真的想检测没有任何一种奇怪的错误的原因是“奇怪”的语法的意见,我想这将是一段;-)

方式
0

这将匹配在PHP注释行(/ * * /和//格式)

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

要获得所有比赛中,使用preg_match_all获得比赛的阵列。