我一直试图从我的服务器上的某个.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); }
我把代码的结果费用给了我一个正则表达式匹配,导致一个包含参数和它们的值组合在一起的数组.
然后我使用split函数实际给我分离的参数和值,所以我可以将它们返回到调用函数的变量.
为了使其正常工作,我需要更改我使用的评论样式
/** * @param foo bar * @return baz */
至
/* @param: foo bar @return: baz */
使其成为正常的评论块,而不是文档评论块.
它还使我能够使用’:’作为分割功能的模式.
在某些人看来,它可能“不那么有效”.正如费耶拉所说,“如果你的评论风格改变了怎么办?”.我将是唯一一个从事该项目并编写插件的人.因此,对于我而言,在每个插件脚本中保持评论样式相同也不会太难.
这种方法对我来说很有效.
谢谢大家对此的帮助.
您可以使用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]; }