我正在尝试在PHP文件中的某些函数调用之前获取docblock。与通常的方法不同的是,我不是要解析函数定义的docblock。
示例文件:
<?php
$data = get_data($id);
if ( empty( $data->random ) ) {
/**
* Brief description
*
* @since 1.0
* @param int $var Variable
*/
do_function( 'identifier', $var );
exit;
}
// random comment
$status = get_random_function($post);
?>
do_function
确实出现在我要解析的各种文件的各个地方。我正在尝试获取和解析的是前面的docblock,包括函数调用。
Reflection类不是一个选项,因为文件不包含类,所以我坚持使用以下返回空数组的RegExp:
preg_match_all('/(\/\*.+\*\/)[\s]{0,}do_function/m', $filecontent_as_string, $results);
我在这里做错了什么?谢谢!
答案 0 :(得分:2)
对于这种情况,请查看Tokenizer或Reflection。您可能还会看到file,您可以使用它来匹配这些特定的注释行,并让它返回一行数组。
如果你想在这种情况下使用正则表达式,这应该可以做你想要的。
/(\/\*(?:[^*]|\n|(?:\*(?:[^\/]|\n)))*\*\/)\s+do_function/
查看实际演示here
正则表达式:
( group and capture to \1:
\/ match '/'
\* match '*'
(?: group, but do not capture (0 or more times)
[^*] | any character except: '*' OR
\n | any character of: '\n' (newline) OR
(?: group, but do not capture:
\* match '*'
(?: group, but do not capture:
[^\/] | any character except: '/' OR
\n any character of: '\n' (newline)
) end of grouping
) end of grouping
)* end of grouping
\* match '*'
\/ match '/'
) end of \1
\s+ whitespace (\n, \r, \t, \f, and " ") (1 or more times)
do_function 'do_function'
答案 1 :(得分:1)
您可以使用以下内容更简单的正则表达式:
#(?s)(/\*(?:(?!\*/).)+\*/)\s+do_function#
(?s)
可以设置为标记(#(/\*(?:(?!\*/).)+\*/)\s+do_function#s
),并使.
匹配换行符。
/\*
匹配docblock的开头。
(?:(?!\*/).)+
匹配除*/
以外的所有字符。
\*/
匹配docblock的结尾。
\s+do_function
匹配空格和换行符,直到找到do_function
。