我一直在尝试使用正则表达式来匹配PHP注释。正则表达式匹配PHP评论
//([^<]+)\r\n
这就是我得到的,但它并没有真正的工作。
香港专业教育学院还试图
//([^<]+)\r
//([^<]+)\n
//([^<]+)
...无济于事
我一直在尝试使用正则表达式来匹配PHP注释。正则表达式匹配PHP评论
//([^<]+)\r\n
这就是我得到的,但它并没有真正的工作。
香港专业教育学院还试图
//([^<]+)\r
//([^<]+)\n
//([^<]+)
...无济于事
你可能需要难逃 “//”:
\/\/([^<]+)
虽然它只匹配一个评论。它不会在文档中找到它们 – 2009-07-27 17:31:23
在什么程序是你的编码这个正则表达式?如果你担心换行符不起作用,你的最后一个例子是一个很好的理智检查。 (我不知道你为什么不允许低于您的评论。我假设这是特定于应用程序)
尝试
//[^<]+
,看看是否可行。正如Draemon说的,你可能不得不逃离对角线。您可能还必须跳过括号。我不知道你是否知道这一点,但括号经常用于包含捕获组。最后,检查双斜线后是否至少有一个字符。
要匹配的意见,你要觉得有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
(你“只是”可能剥离//
和/* */
,但这是 由你决定 ;至少,你已经提取了意见^^)
如果你真的想检测没有任何一种奇怪的错误的原因是“奇怪”的语法的意见,我想这将是一段;-)
方式这将匹配在PHP注释行(/ * * /和//格式)
/(\/\*).*?(\*\/)|(\/\/).*?(\n)/s
要获得所有比赛中,使用preg_match_all获得比赛的阵列。
可以使用关于您想要实现的内容的更多信息,以及与*匹配*的语言。 – Draemon 2009-07-27 17:31:00