preg_match PHP 评论不包括引号

preg_match PHP comments excluding if in quotes

我正在尝试编写一个正则表达式来查找和匹配 PHP 代码文件中的注释文本,到目前为止我所做的一切工作正常,但有一个例外:

我的模式:

$pattern='/((?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:\/\/.*))/';

它仍然匹配这样的行

$string="//this is not a comment"

$string2="/*this is not a comment */"

我知道我需要在某处添加 (?:^|[^"]+[^"]),但真的不知道如何添加,是否有可能避免介于“ ”之间的任何内容?

如您所见,使用正则表达式会很棘手。但是 PHP 内置了解析自身的函数,比如 token_get_all().

这是一个简单的测试脚本,它将读取名为 foo.php 的假设文件中的 PHP 代码并打印出所有注释,而不考虑注释字符 (//, #, 或 /* */):

<?php
$code = file_get_contents('foo.php');
$tokens = token_get_all($code);
foreach ($tokens as $token) {
    if (is_array($token)) { // Sometimes the token element will be a single character, like ; . > ! etc.
        if (token_name($token[0]) === 'T_COMMENT' || token_name($token[0]) === 'T_DOC_COMMENT') {
            echo $token[1] . PHP_EOL;           
        }
    }
}