解析函数调用的docblock,而不是函数定义?

时间:2013-09-09 19:07:25

标签: php regex comments docblocks

我正在尝试在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);

我在这里做错了什么?谢谢!

2 个答案:

答案 0 :(得分:2)

对于这种情况,请查看TokenizerReflection。您可能还会看到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#

regex101 demo

(?s)可以设置为标记(#(/\*(?:(?!\*/).)+\*/)\s+do_function#s),并使.匹配换行符。

/\*匹配docblock的开头。

(?:(?!\*/).)+匹配除*/以外的所有字符。

\*/匹配docblock的结尾。

\s+do_function匹配空格和换行符,直到找到do_function