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