我在PHP中创建一个ORM,我认为在注释注释中注释表,列,数据库等,可能是一个好主意。
要获得评论注释,我试试这个
How to find annotations in a PHP5 object?
但我有一些问题,包括一些电子邮件,或其他不是注释的文本,如果它们有@字符。
这是我的功能:
public function getAnnotationArrayFromDocComment($docComment) {
$annotationsArray = [];
preg_match_all('#@(.*?)\n#s', $docComment, $annotations);
foreach ($annotations[1] as $annotation) {
$explotedAnnotation = explode(" ", $annotation);
if (isset($explotedAnnotation[1])) $annotationsArray[trim($explotedAnnotation[0])] = trim($explotedAnnotation[1]);
else $annotationsArray[trim($explotedAnnotation[0])] = "";
}
return $annotationsArray;
}
基本上,这个函数返回一个具有这种结构的数组:
["annotation" => "valueOfAnnotation"]
我很清楚只会得到第一个字的“错误”,我的下一步就是解决这个问题。
这里的问题是,对于某些评论,如果评论有一些电子邮件地址,或其他带有@字符的文本,它们就像注释一样出现在数组中,例如:
/**
* Created by Someone <email@example.com>
* This class do anything
*
* @package namespace
*/
我希望这次回归:
["package" => "namespace"]
但这回归:
["example.com>" => "", "package" => "namespace"]
¿有人有这个想法吗?
感谢和抱歉我的英语有任何错误,这不是我的自然语言。
答案 0 :(得分:2)
在电子邮件地址中,@
始终只是关闭其他字符,而在实际注释中,它始终至少有一个空格。
所以你可能只是改变你的正则表达式来反映:
preg_match_all('# @(.*?)\n#s', $docComment, $annotations);
并且它没有任何其他工作正常,因为在你的功能中你已经trim()
注释......到目前为止这是无用的。)