Php preg_match_all-解析简单代码

Php preg_match_all-解析简单代码,php,regex,preg-match-all,Php,Regex,Preg Match All,我无法将文本解析为数组 我的正则表达式: /\s*DEF\s+FUNC\s+(\w+\d*)\((\w*[.\s\w]*|)\)\s*{\s*(.*)\s*}/s 我的文本: DEF FUNC test(param) { test1; }; DEF FUNC testSecond() { test1 test1 }; 它应该返回如下数组: ( [0] => DEF FUNC test(param) { test1;

我无法将文本解析为数组

我的正则表达式:

/\s*DEF\s+FUNC\s+(\w+\d*)\((\w*[.\s\w]*|)\)\s*{\s*(.*)\s*}/s
我的文本:

DEF FUNC test(param) 
{
    test1;
};

DEF FUNC testSecond() 
{
    test1
    test1
};
它应该返回如下数组:

(
[0] => DEF FUNC test(param) 
       {
          test1;
       };

[1] => DEF FUNC testSecond() 
       {
          test1
          test1
       };  
)
但现在数组中只有一个元素:

(
[0] => DEF FUNC test(param) 
       {
          test1;
       };

       DEF FUNC testSecond() 
       {
          test1
          test1
       };  
)

如何修复此问题?

使
*
量词与
一起变懒?
(.*)

您的正则表达式也可以简化,
(\w*[。\s\w]*|)与
([。\s\w]*)
相同(这里的
代表一个点,而不是任何字符):


这是因为贪婪。块内的
*
将尽可能多地读取任何内容,这意味着最后一个
}
将是文本中的最后一个

要使其不贪婪,您可以在
*
量词后面加一个问号

/DEF\s+FUNC\s+(?:\w+\d*)\([.\s\w]*\)\s*{.*?}/s
我还将正则表达式简化如下:

  • 使捕获组不捕获,并删除不必要的组
  • 前面的空白似乎没有必要
  • (\w*[。\s\w]*|)与
    [。\s\w]*
  • 在块内部,
    *
    已经处理了周围的空白
最后,这个正则表达式不是很可靠。如果在
DEF
块的某个地方有一个右大括号,
}
,那么它会把一切都搞糟。使用正则表达式无法正确实现这一点


如果你对此非常认真,那么编写一个小解析器可能是一个不错的选择。

你需要为此实现一个真正的解析器。这很简单。我不创建新语言;)正则表达式不计数,所以您不可能在任意数量的匹配项前面放置递增的数字。
/DEF\s+FUNC\s+(?:\w+\d*)\([.\s\w]*\)\s*{.*?}/s