为了账号安全,请及时绑定邮箱和手机立即绑定

PHP/PCRE 正则表达式以递归模式开头

PHP/PCRE 正则表达式以递归模式开头

PHP
凤凰求蛊 2022-10-14 15:53:28
我正在尝试将降价标签与递归匹配。输入语法(TYPE: VALUE ATTR_KEY: ATTR_VALUE)请注意,语法应以:[a-z0-9_-]+:样本输入:(image: sky.jpg)(image: sky.jpg caption: Sky (Issue This) View)(link: https://stackoverflow.com text: Stack Overflow)(link: https://stackoverflow.com text: Stack Overflow rel=nofollow)(video: http://www.youtube.com/watch?v=49Kh1mS4Fhs)目前使用以下正则表达式:(?=[^\]])\([a-z0-9_-]+:.*?\)但是问题来自这里,因为匹配:(image: sky.jpg caption: Sky (Issue This)预期匹配:(image: sky.jpg caption: Sky (Issue This) View)如果在括号中再次使用括号,则不完全匹配。我尝试遵循递归模式和工作,但我需要限制以字符开头。(?s)\((?:[^()]+|(?R))*+\)\((?:[^)(]+|(?R))*+\)
查看完整描述

1 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

您应该使用积极的前瞻来匹配以确保匹配以该模式开头,但您必须将整个括号匹配模式包装在另一个捕获组中并使用(?1)子例程而不是(?R)仅递归该模式,而不是整个正则表达式:


(?=\([a-z0-9_-]+:)(\((?:[^()]+|(?1))*+\))

^^^^^^^^^^^^^^^^^^^            ^^^^     ^

请参阅正则表达式演示。


细节


(?=\([a-z0-9_-]+:)- 一个正向前瞻,需要(1+ 小写 ASCII 字母、数字、下划线或连字符,:紧跟在当前位置的右侧

(\((?:[^()]+|(?1))*+\))- 捕获组 1(稍后将递归):

\(-(

(?:[^()]+|(?1))*+- 1+ 重复 1+ 除(和)或整个 Group 1 模式以外的任何字符(递归)

\)-)

如果您还想支持笑脸,您可以将它们的特定模式添加到正则表达式子例程所在的交替组中,作为第一种选择:


(?=\([a-z0-9_-]+:)(\((?::[)(]|[^()]|(?1))*+\))

                        ^^^^^  

我在后面添加:[)(]匹配:)或:(删除+,[^()]以便能够逐个字符地检查嵌套括号内的字符串。


随意调整它以适应您的需求,或添加更多笑脸图案。


使用正则表达式查看这个正则表达式演示(?=\([a-z0-9_-]+:)(\((?::(?:[()pPDd*oO]|'\()|<3|;\)|[^()]|(?1))*+\))。


查看完整回答
反对 回复 2022-10-14
  • 1 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信