目前我有以下情况: 我正在尝试“解析”一个文本,寻找占位符(他们的符号是“{...}”),稍后,我将用实际文本替换它们。
我想到了正则表达式
$foo = "Hello World {foo{bar}} World Hello!";
$bar = array();
preg_match_all('@\{.+\}@U', $foo, $bar);
var_dump($bar);
但是这会返回
array(1) { [0]=> array(1) { [0]=> string(9) "{foo{bar}" } }
让它变得贪婪将导致:
array(1) { [0]=> array(1) { [0]=> string(10) "{foo{bar}}" } }
但我希望结果如下:
array(1) { [0]=> array(2) { [0]=> string(5) "{bar}" [1]=> string(10) "{foo{bar}}" } }
有没有办法在preg_match(_all)和正则表达式的帮助下达到这个目的?
或者我必须一次又一次地循环我的$ bar,直到结果集中没有剩下的子语句?
答案 0 :(得分:3)
你很幸运,你有PCRE。这必须使用递归来解决:http://regex101.com/r/pO3hA0
/(?=({(?>[^{}]|(?1))+}))/g
(你不需要php中的g标志)