什么时候可以使用递归正则表达式当然,在匹配的字符串中递归地存在一个模式。

假设文本包含正确配对的嵌套圆括号。圆括号的深度可以是无限层。要捕获括号组。
复制代码代码如下所示:
< PHP
一些文本(a(b(c)D)E)更多文本;
如果(preg_match( / ((} + |){ ^((R))* ) /
回声;print_r($matches);回声;
}
>

结果是:
复制代码代码如下所示:
阵列

({ 0 } a(b(c)D)e)
{ 1 } e


可以看出,我们需要的文本已经在$匹配{ 0 }中被捕获了。

原理

现在想一想原则。

关键是上面的正则表达式(R)。(r)是递归地替换它所处的积分正则表达式的作用。在每次迭代中,PHP解析器将取代((R)(} + |){ ^((R))* )。
因此,对于上面的例子,正则表达式等价于:
复制代码代码如下所示:
(()( / { ^(} + | ({ ^()((){ ^(} + | } +)* )* / * ))))

但上面的代码只适用于3层括号。必须使用具有未知深度的括号的嵌套。
复制代码代码如下所示:
(() / { ^ } + |((R)) / * )

它不仅匹配无限深度,而且简化正则表达式的语法。它的语法功能强大而简单。

现在仔细看看它 / ((} + |){ ^((R))* ) / ,(A(B(C)d)e):

(c)这部分是(()}(* )),。请注意(c)是一个相当于整个递归的缩影,麻雀可能很小,所以它使用正则表达式。
换句话说,(c)在下一步中,您可以使用(r)匹配。

(b(c)d)的匹配过程是:
()。
{(});
(r)匹配(c);
{(});
匹配。

根据上述匹配原则,不难理解为什么数组的第二个元素相当于$匹配{ 1 }。在过去的substring'e'is匹配迭代捕获。在匹配过程中,只有last'e捕获结果将保存到数组。
针对这一特点,你可以自己试一试看看是否可以使用正则形式({ } { } +字母+数字0-9)+匹配字符串abc123xyz890和捕捉到1美元。注意,结果与左最长原则不冲突。

如果我们只需要捕获$匹配{ 0 },我们可以做到这一点:
复制代码代码如下所示:
< PHP
一些文本(a(b(c)D)E)更多文本;
如果(preg_match( /((:)} + | { ^((R))*) /
{
回声;print_r($matches);回声;
}
>
结果是一样的:

阵列

({ 0 } a(b(c)D)e)


更改是将括号()捕获到非捕获捕获圆括号(())中。

它可以进一步改进如下:
复制代码代码如下所示:
< PHP
一些文本(a(b(c)D)E)更多文本;
如果(preg_match( /((> { ^)} + |((R))*) /
{
回声;print_r($matches);回声;
}
>

在这里,我们使用所谓的一次性模式(雷克斯注:于胜先生V3.0掌握正则表达式,可以参考本书的翻译。还建议PHP手册,只要条件允许,就可以使用这个模型,以提高正则表达式的速度。