Preg_match_all -解析简单代码


preg_match_all - parse simple code

我有问题解析文本到数组

我的正则表达式:

/'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]*)相同(这里的.代表点,而不是任何字符):

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

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

可以在*量词后加一个问号。

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

我也简化了正则表达式如下:

  • 使捕获组不捕获,并删除不需要的组
  • 前导空格似乎没有必要
  • ('w*[.'s'w]*|)[.'s'w]*相同
  • 在块内,.*已经处理了周围的空白

最后,这个正则表达式不是很可靠。如果在DEF的块中有一个闭花括号},那么它会把一切都搞砸。没有办法使用正则表达式正确地做到这一点。

如果你真的很认真,那么写一个小解析器可能是一种方法。