4

目前我有以下情况:我正在尝试“解析”文本,寻找占位符(它们的符号是“{...}”),稍后,我将用实际文本替换它们。

我想到了正则表达式

$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,直到结果集中没有子语句?

4

1 回答 1

3

你很幸运你有这个 PCRE。这必须使用递归来解决:http ://regex101.com/r/pO3hA0

/(?=({(?>[^{}]|(?1))+}))/g(你不需要 php 中的 g 标志)

于 2012-09-03T09:03:12.670 回答