php – 如何编写与嵌套括号匹配的递归正则表达式?

前端之家收集整理的这篇文章主要介绍了php – 如何编写与嵌套括号匹配的递归正则表达式?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图写一个匹配嵌套括号的正则表达式,例如:
"(((text(text))))(text()()text)(casual(characters(#$%^^&&#^%#@!&**&#^*!@#^**_)))"

应该匹配这样的字符串,因为所有嵌套的括号都是关闭的,而是:

"(((text)))(text)(casualChars*#(!&#*(!))"

不应该或者更好的是,应该至少匹配第一个“(((text)))(text)”部分.

实际上,我的正则表达式是:

$regex = '/( (  (\() ([^[]*?)  (?R)?  (\))  ){0,}) /x';

但它并没有像我期待的那样正常工作.如何解决?我哪里错了?谢谢!

当我找到这个答案时,我无法弄清楚如何修改模式以使用我自己的分隔符{}和{}.所以我的方法是让它更通用.

这是一个使用您自己的变量左右分隔符生成正则表达式模式的脚本.

$delimiter_wrap  = '~';
$delimiter_left  = '{';/* put YOUR left delimiter here.  */
$delimiter_right = '}';/* put YOUR right delimiter here. */

$delimiter_left  = preg_quote( $delimiter_left,$delimiter_wrap );
$delimiter_right = preg_quote( $delimiter_right,$delimiter_wrap );
$pattern         = $delimiter_wrap . $delimiter_left
                 . '((?:[^' . $delimiter_left . $delimiter_right . ']++|(?R))*)'
                 . $delimiter_right . $delimiter_wrap;

/* Now you can use the generated pattern. */
preg_match_all( $pattern,$subject,$matches );

猜你在找的PHP相关文章