如何使用PHP正则匹配controllers => factories范围内的嵌套配置内容
正则修改方案
你可以使用调整后的正则表达式,实现仅匹配controllers =>数组范围内的factories段:
'controllers' => (\[(?:[^][]++|(?1))*])(?s:.*?)('factories' => (\[(?:[^][]++|(?3))*]))
原理解释
- 先通过递归分组
(\[(?:[^][]++|(?1))*])精准匹配'controllers' =>对应的完整嵌套数组,锁定父容器的边界范围 - 中间的
(?s:.*?)惰性匹配父容器内controllers数组起始位置到factories键之间的所有内容,不会跳出父容器边界 - 后半段沿用你原有逻辑递归匹配
factories对应的嵌套数组,第2个捕获组就是完整的'factories' => [...]目标内容,第3个捕获组为factories数组的内部内容
适配说明
- 该正则兼容PCRE正则引擎,和你现有使用场景的引擎匹配
- 如果配置文件中存在注释、特殊转义字符,可以在
[^][]规则中额外补充需要过滤的字符规则即可
你之前的正则未增加父容器范围约束,会全局扫描所有factories键对应的数组段,修改后增加了父容器锚定和范围限制,不会命中外层的同名字段。
内容的提问来源于stack exchange,提问作者divix
相关产品推荐
相关产品推荐

