千家信息网

怎么在PHP中使用递归正则表达式

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章给大家介绍怎么在PHP中使用递归正则表达式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。什么时候会用到递归正则表达式呢? 当然是待匹配的字串中递归地出现某种模式时(貌似废
千家信息网最后更新 2025年01月23日怎么在PHP中使用递归正则表达式

这篇文章给大家介绍怎么在PHP中使用递归正则表达式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

什么时候会用到递归正则表达式呢? 当然是待匹配的字串中递归地出现某种模式时(貌似废话). 最经典的例子, 就是递归正则处理嵌套括号的问题了. 例子如下.

假设你的文本中包含了正确配对的嵌套括号. 括号的深度可以是无限层. 你想捕获这样的括号组.

复制代码 代码如下:


$string = "some text (a(b(c)d)e) more text";
if(preg_match("/\(([^()]+|(?R))*\)/",$string,$matches)) {
echo "

"; print_r($matches); echo "
";
}
?>


结果是:

复制代码 代码如下:


Array
(
[0] => (a(b(c)d)e)
[1] => e
)


可见, 我们所需要的文本, 已经捕获到$matches[0]中了.

原理

现在思考原理.

上面的正则表达式中的关键点是(?R). (?R)的作用就是递归地替换它所在的整条正则表达式. 在每次迭代时, PHP 语法分析器都会将(?R)替换为"\(([^()]+|(?R))*\)".
因此, 具体到上述的例子, 其正则表达式等价于:

复制代码 代码如下:


"/\(([^()]+|\(([^()]+|\(([^()]+)*\))*\))*\)/"


但是上面的代码只适合深度为3层的括号. 对于未知深度的括号嵌套, 就只好使用这种正则了:

复制代码 代码如下:


"/\(([^()]+|(?R))*\)/"


它不但能够匹配无限深度, 还简化了正则表达式的语法. 功能强大, 语法简洁.

现在来细看一下"/\(([^()]+|(?R))*\)/"是怎样匹配"(a(b(c)d)e)"的:

"(c)"这部分被正则式 "\(([^()]+)*\)" 匹配. 请注意, (c) 其实就相当于整个递归的一个缩影, 麻雀虽小五脏俱全, 因此它用到了整个正则表达式.
换言之, 下一步中的(c), 可以使用(?R) 来匹配.

(b(c)d)的匹配过程为:
"\("匹配"(";
"[^()]+"匹配"b";
(?R)匹配"(c)";
"[^()]+"匹配"d";
"\)"匹配")".

根据上面的匹配原理, 不难理解为什么数组的第2个元素$matches[1]与'e'等价. 子串'e'是在最后一次匹配迭代中被捕获. 匹配过程中, 只有最后一次的捕获结果才会保存到数组中.
关于这个特性, 可以自行尝试一下, 看看使用正则式([a-z]+[0-9]+)+来匹配字串abc123xyz890, 其捕获结果$1是什么. 注意, 其结果与 Left Longest 原理并不冲突.

如果我们只需要捕获 $matches[0], 可以这样做:

复制代码 代码如下:


$string = "some text (a(b(c)d)e) more text";
if(preg_match("/((?:[^()]+|(?R))*)/",$string,$matches))
{
echo "

"; print_r($matches); echo "
";
}
?>
产生的结果相同:

Array
(
[0] => (a(b(c)d)e)
)


所做的改动是捕获括号()改为非捕获捕获括号(?:)了.

还可以进一步完善为:

复制代码 代码如下:


$string = "some text (a(b(c)d)e) more text";
if(preg_match("/((?>[^()]+|(?R))*)/",$string,$matches))
{
echo "

"; print_r($matches); echo "
";
}
?>

关于怎么在PHP中使用递归正则表达式就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

代码 正则 表达式 括号 递归 结果 原理 深度 例子 语法 面的 内容 就是 数组 文本 更多 等价 过程 帮助 迭代 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 OXS服务器 管家婆数据库密码怎么修改 概念网络技术有限公司 圣安地列斯搭建服务器 临沂顺商网络技术服务有限公司 查看其他服务器的资源管理器 网络安全应急响应的措施 北邮计算机网络技术2 青浦区性能优良网络技术现价 国家网络安全如何保障的 重庆网络安全培训服务 系统软件开发月报模板 云服务器管理申请注册 mc服务器如何传送别人 oppo软件开发岗 广州久爱网络技术有限公司 上海拍牌软件开发 蔚来软件开发中国副总裁 计算机网络技术专业专业认知 数据库开发与管理试题及答案 灵武app软件开发 阳江通讯软件开发销售厂 镇雄天气预报软件开发 护苗网络安全教育课5 网络安全意识观后感心得体会 阿左旗网络安全应急指挥中心 开展网络安全检查总结 高新区网络技术服务怎么样 打印服务器和客户机的安装步骤 忍者必须死3哪个服务器福利最多
0