Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:使用正则表达式在语句中查找语句_Php_Regex_Preg Match All - Fatal编程技术网

PHP:使用正则表达式在语句中查找语句

PHP:使用正则表达式在语句中查找语句,php,regex,preg-match-all,Php,Regex,Preg Match All,目前我有以下情况: 我试图“解析”一个文本,寻找占位符(它们的符号是“{…}”),稍后,我将用实际文本替换它们 我想到了正则表达式 $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{b

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

我想到了正则表达式

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

你很幸运你有PCRE。这必须使用递归来解决:


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

您将如何替换文本?如果您想允许嵌套组,在有占位符的情况下进行迭代是有意义的。谢谢!在结果数组中,{bar}始终在{foo{bar}之前,是否有一个“保证”?引擎将从“外部”匹配,并以其方式进入,如果您愿意的话。因此,您应该得到
[0]=>{foo{bar}[1]=>{bar}
谢谢,但我编写了一个小函数,它将按“复杂性”(计算结果中的大括号…)对结果进行排序