【发布时间】:2012-07-15 07:32:47
【问题描述】:
我一直试图从我服务器上的某个 .php 文件中取出 cmets,以便解析它的变量。我以为我找到了一个简单的方法来做到这一点,然而,我使用的函数没有返回任何内容,即使我在文件中显然有 cmets。
这是我使用的 cmets:
/**
* @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 的例子来改变我的函数来获取cmets 和它的变量。
然后我稍微更改了它的代码以满足我的需要:
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 所说,“如果您的评论风格发生变化怎么办?”。我将是唯一一个在这个项目上工作并编写插件的人。因此,在每个插件脚本中保持相同的注释样式对我来说也不会太难。
这种方法对我来说非常有效。
感谢大家对此的帮助。
【问题讨论】:
-
当你做 print_r($matches); 它打印什么??
-
您不能使用正则表达式来可靠地完成此操作。
-
不要介意我的参数前面的反斜杠,因为我需要把它们放在那里,因为我认为我在这个评论中通知了某人:Array ( [0] => Array ( [0] => /** * \@param foo bar * \@return baz / ) [1] => 数组 ( [0] => /* * \@param foo bar * \@return baz */ ) )