0

我正在尝试在 PHP 文件中的某些函数调用之前获取 docblocks。与通常方法的不同之处在于我不尝试解析函数定义的文档块。

示例文件:

<?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确实出现在我要解析的各种文件的各个地方。我要获取和解析的是前面的文档块,包括函数调用。

反射类不是一个选项,因为文件不包含类,所以我坚持使用以下返回空数组的 RegExp:

preg_match_all('/(\/\*.+\*\/)[\s]{0,}do_function/m', $filecontent_as_string, $results);

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

4

2 回答 2

2

在这种情况下查看TokenizerReflection。您可能还会看到文件,您可以在其中匹配某些特定的注释行并让它返回一个行数组。

如果您在这种情况下需要一个正则表达式,这应该可以满足您的需求。

/(\/\*(?:[^*]|\n|(?:\*(?:[^\/]|\n)))*\*\/)\s+do_function/

在此处查看实际演示

正则表达式:

(                     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'
于 2013-09-09T19:34:40.613 回答
1

您可以使用以下内容获得更简单的正则表达式:

#(?s)(/\*(?:(?!\*/).)+\*/)\s+do_function#

正则表达式101演示

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

/\*匹配文档块的开头。

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

\*/匹配文档块的结尾。

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

于 2013-09-09T20:46:21.490 回答