在PHP文件中获取注释


Get comments in a PHP file

我一直在尝试从服务器上的某个.php文件中获取注释,以便解析其变量。我想我找到了一个简单的方法来做这件事,然而,我使用的函数没有返回任何东西,尽管我在文件中显然有注释。

以下是我使用的评论:

/**
* @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
*/

使其成为一个普通的注释块,而不是文档注释块。它还使我能够使用":"作为split函数的模式。

在一些人看来,这可能"没有那么有效"。正如feeela所指出的;如果你的评论风格改变了怎么办&";。我将是唯一一个工作在这个项目和编写插件。因此,对我来说,在每个插件脚本中保持评论风格不变不会太难。

这个方法非常适合我。

您可以使用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];
}

尝试使用ReflectionClass类ReflectionFunction类

这一切都是你需要得到的函数参数。

查看Comment Manager。它是一组用于解析DocBloc注释的PHP类。它还允许根据DocBlock注释中的信息验证函数参数值。