PHP,正则表达式和新行

时间:2012-06-10 19:55:04

标签: php regex

  

可能重复:
  A PHP regex to extract php functions from code files

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

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()

之后的所有内容

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

2 个答案:

答案 0 :(得分:1)

@John 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);
}

答案 1 :(得分:0)

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

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

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