8

我一直在尝试从服务器上的某个.php文件中获取注释,以解析其变量。我认为 Ii 找到了一种简单的方法来做到这一点,但是,我使用的函数不会返回任何内容,即使我在文件中清楚地有注释。

以下是我使用的评论:

/**
* @param  foo bar
* @return baz
*/

这是我的代码:

function GetComments($filename) {

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

    $file = fopen($filename, "r");
    $length = filesize($filename);
    $comments = fread($file, $length);
    fclose($file);

    preg_match_all($expr, $comments, $matches);

    foreach($matches[0] as $id => $variable) {
        $comments = str_replace($variable, '', $comments);
    }

    return $comments;
}

有什么我做错了吗?因为如果是这样,我显然是在看它。

任何帮助都会非常受欢迎。


我找到了答案:

首先,我可能应该在我的问题中指出我正在尝试编写一个用于读取插件的系统。这些插件文件应在顶部包含一个注释块,其中包含插件的作者、网站、电子邮件等变量。

所以这就是我所做的:

我以feeela 的示例来更改我的函数以获取评论及其变量。

然后我稍微改变了它的代码以满足我的需要:

public function GetComments($filename)
{

    $docComments = array_filter(token_get_all(file_get_contents($filename)), function($entry)
    {
        return $entry[0] == T_COMMENT;
    });
    $fileDocComment = array_shift($docComments);

    $regexp = "/\@.*\:\s.*\r/";
    preg_match_all($regexp, $fileDocComment[1], $matches);

    for($i = 0; $i < sizeof($matches[0]); $i++)
    {
        $params[$i] = split(": ", $matches[0][$i]);
    }

    return($params);
}

我把feeela给我的代码结果通过一个正则表达式匹配,得到一个包含参数和它们的值组合的数组。

然后我使用 split 函数实际上给了我分离的参数和值,所以我可以将它们返回给调用该函数的变量。

为了让它正常工作,我需要更改我使用的评论样式

/**
* @param foo bar
* @return baz
*/

/*
@param: foo bar
@return: baz
*/

使其成为普通的注释块,而不是文档注释块。它还使我能够使用 ':' 作为拆分功能的模式。

在某些人看来,它可能“效率不高”。正如feeela 所说,“如果您的评论风格发生变化怎么办?”。我将是唯一一个在这个项目上工作并编写插件的人。因此,在每个插件脚本中保持相同的注释样式对我来说也不会太难。

这种方法对我来说非常有效。

4

3 回答 3

10

您可以使用token_get_all(),它“使用 Zend 引擎的词法扫描器将给定的 PHP 源字符串解析为语言标记”。

这是我曾经用来从当前文件中获取文件文档注释的示例函数:

/**
 * Return first doc comment found in this file.
 *
 * @return string
 */
function getFileDocBlock()
{
    $docComments = array_filter(
        token_get_all( file_get_contents(__FILE__)), function($entry) {
            return $entry[0] == T_DOC_COMMENT;
        }
    );
    $fileDocComment = array_shift($docComments);
    return $fileDocComment[1];
}
于 2012-07-16T13:03:54.120 回答
3

尝试使用ReflectionClass 类ReflectionFunction 类

这就是你需要获取的函数参数。

于 2012-07-16T12:44:40.750 回答
0

看看评论管理器它是一组用于解析DocBloc注释的 PHP 类。它还允许根据 DocBlock 注释中的信息验证函数参数值。

于 2019-03-27T07:24:05.960 回答