在php文件中获取评论

时间:2012-07-16 12:41:42

标签: php parsing comments

我一直在尝试从我的服务器上的某个.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;
}

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

非常欢迎任何帮助。

编辑:

我找到了答案:

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

所以这就是我所做的:

我采用了费耶拉的例子来改变我的功能以获得评论及其变量 然后我改变了它的代码以满足我的需求:

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);
}

我把codeela的代码结果给了我一个正则表达式匹配,产生一个包含参数及其值组合的数组。
然后我使用split函数实际给出了分离的参数和值,所以我可以将它们返回给调用函数的变量。

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

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

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

使其成为正常的评论区块,而不是文档评论区块 它还使我能够使用':'作为分割功能的模式。

在某些人看来,它可能“不那么有效”。正如费耶拉所说,“如果你的评论风格改变了怎么办?”。我将是唯一一个从事该项目并编写插件的人。因此,对于我来说,在每个插件脚本中保持评论风格相同也不会太难 这种方法对我来说很有效。

谢谢大家对此的帮助。

3 个答案:

答案 0 :(得分:6)

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

请参阅:http://php.net/token_get_all

这是我用过一次从当前文件中获取file-doc-comment的示例函数:

/**
 * 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];
}

答案 1 :(得分:3)

答案 2 :(得分:0)

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