0

可能重复:
从代码文件中提取 php 函数的 PHP 正则表达式

我有一个文件,其中包含格式如下的函数列表:

function foo(){
      ...code { code{}  } code...
}

对于这个特定的文件,我将始终将单词“function”一直放在左侧,并将结尾的花括号一直放在左侧。按照惯例,函数中的代码将始终缩进。函数中的代码可以包含任何字符,包括花括号。

我想用 PHP 解析文件以获取函数的关联数组,其中函数的名称是键。我刚开始,这是一个非常简单的开始:

$regex = "/function.*/";
preg_match_all($regex, $str, $result, PREG_PATTERN_ORDER);
$arr = $result[0];

print_r($arr);

这将产生以下内容并在每个新行处停止:

Array
(
    [0] => function foo(){
    [1] => function bar(){
    [2] => function stop(){
    [3] => function go(){
)

我尝试将正则表达式更改为:

$regex = "/function.*\n}$/s";

我的想法是,如果有一个换行符直接跟在一个结束大括号之后,\n}$就会匹配函数的结尾。但是,这不起作用,它会生成一个包含一个长元素的数组,该元素包含之后的所有内容function foo()

我还没有开始将函数名放入关联数组的键中。

4

2 回答 2

2

@约翰·R

这是正则表达式解决方案:

$regex = '~
  function                 #function keyword
  \s+                      #any number of whitespaces 
  (?P<function_name>.*?)   #function name itself
  \s*                      #optional white spaces
  (?P<parameters>\(.*?\))  #function parameters
  \s*                      #optional white spaces
  (?P<body>\{.*?\})        #body of a function
~six';

if (preg_match_all($regex, $input, $matches)) {
  print_r($matches);
}
于 2012-06-10T20:35:49.400 回答
0

在您的情况下,这样的表达式可能就足够了:

/^function\s++(\w++).*?^}/ms

它在第一个}没有缩进的地方停止匹配。函数名将在第一个捕获组中,整个匹配就是函数。

于 2012-06-10T19:59:40.673 回答