我一直试图使用正则表达式匹配PHP评论。
//([^<]+)\r\n
多数民众赞成,但它确实无效。
我也试过
//([^<]+)\r
//([^<]+)\n
//([^<]+)
......无济于事
答案 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获取匹配数组。