我一直在尝试从服务器上的某个.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注释中的信息验证函数参数值。