preg_match_all - 解析简单代码

时间:2014-03-25 23:54:13

标签: 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;
       };

[1] => DEF FUNC testSecond() 
       {
          test1
          test1
       };  
)

但现在我在数组中只有一个元素:

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

       DEF FUNC testSecond() 
       {
          test1
          test1
       };  
)

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

使用*?使(.*?)量词变得懒惰。

此外,您的正则表达式可以简化,(\w*[.\s\w]*|)([.\s\w]*)相同(此处的.代表点,而不是任何字符):

/\s*DEF\s+FUNC\s+(\w+\d*)\([.\s\w]*\)\s*{\s*(.*?)\s*}/s

答案 1 :(得分:0)

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

为了使其不贪婪,你可以在*量词之后加上一个问号。

/DEF\s+FUNC\s+(?:\w+\d*)\([.\s\w]*\)\s*{.*?}/s

我还简化了正则表达式,如下所示:

  • 使捕获组无法捕获,并删除不必要的组
  • 似乎没有必要使用领先的空白
  • (\w*[.\s\w]*|)[.\s\w]*
  • 相同
  • 在区块内,.*已经处理了周围的空白区域

最后,这个正则表达式不是很可靠。如果在}的块内某处有一个结束大括号DEF,那么它会把所有东西搞砸。使用正则表达式无法正确执行此操作。

如果你真的很认真,那么写一个小解析器可能就好了。