在 PHP 中,我有带有嵌套括号的字符串:
bar[foo[test[abc][def]]bar]foo
我需要一个匹配内部括号对的正则表达式,因此preg_match_all
找到匹配括号对的顺序应该是:
[abc]
[def]
[test[abc][def]]
[foo[test[abc][def]]bar]
所有文本可能会有所不同。
这甚至可能preg_match_all
吗?
在 PHP 中,我有带有嵌套括号的字符串:
bar[foo[test[abc][def]]bar]foo
我需要一个匹配内部括号对的正则表达式,因此preg_match_all
找到匹配括号对的顺序应该是:
[abc]
[def]
[test[abc][def]]
[foo[test[abc][def]]bar]
所有文本可能会有所不同。
这甚至可能preg_match_all
吗?
这对于正则表达式是不可能的。无论您的正则表达式多么复杂,它总是会首先返回最左边的匹配项。
充其量,你必须使用多个正则表达式,但即使那样你也会遇到麻烦,因为正则表达式不能真正计算匹配的括号。你最好的办法是用其他方式解析这个字符串。
在你的问题中并不明显你想要什么样的“匹配结构”......但你只能使用简单的数组。尝试
preg_match_all('#\[([a-z\)\(]+?)\]#',$original,$m);
也就是说,for$original = 'bar[foo[test[abc][def]]bar]foo'
返回一个带有“abc”和“def”的数组,即内部数组。
对于您的输出,您需要一个用于“解析任务”的循环。带有preg_replace_callback的PCRE更适合解析。
也许这个循环是解决您问题的好线索,
$original = 'bar[foo[test[abc][def]]bar]foo';
for( $aux=$oldAux=$original;
$oldAux!=($aux=printInnerBracket($aux));
$oldAux=$aux
);
print "\n-- $aux";
function printInnerBracket($s) {
return preg_replace_callback(
'#\[([a-z\)\(]+?)\]#', // the only one regular expression
function($m) {
print "\n$m[0]";
return "($m[1])";
},
$s
);
}
结果(回调打印):
[abc]
[def]
[test(abc)(def)]
[foo(test(abc)(def))bar]
-- bar(foo(test(abc)(def))bar)foo
另请参阅此相关问题。