PHP/PCRE regex以on递归模式开始
我正在尝试将降价标记与递归匹配 输入语法PHP/PCRE regex以on递归模式开始,php,regex,pcre,Php,Regex,Pcre,我正在尝试将降价标记与递归匹配 输入语法 (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
(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))*+\)
您应该使用正向前瞻来匹配,以确保匹配从该模式开始,但您必须将匹配模式的整个括号包装在另一个捕获组中,并使用而不是
(?R)
来仅递归该模式,而不是整个正则表达式:
(?=\([a-z0-9_-]+:)(\((?:[^()]+|(?1))*+\))
^^^^^^^^^^^^^^^^^^^ ^^^^ ^
看
详细信息
-正向前瞻,要求当前位置右侧紧跟(?=\([a-z0-9_-]+:)
),1+小写ASCII字母、数字、下划线或连字符,后跟(
:
-捕获组1(稍后将递归):(\(((?:[^()]+\(?1))*+\)
-\(
(
-1+重复1+除(?:[^()]+|(?1))*+
和(
以外的任何字符或整个第1组模式(递归))
-\)
)
(?=\([a-z0-9_-]+:)(\((?::[)(]|[^()]|(?1))*+\))
^^^^^
我在[^()]
之后添加了与:)
或:(
匹配的:[)(]
,并删除了+
,以便能够逐个字符检查嵌套括号内的字符串
您可以根据自己的需要随意调整或添加
请参见带有
(?=\([a-z0-9+]:)(\((?::(?:[()pPDd*oO]|')\()|你不能只匹配整个标记,然后用PHP拆分字符串处理它吗?@Justinas我只处理标记,而不是在每个括号内。当然,我们使用缺少的括号不匹配。但是当我们使用表情符号时,它不匹配,尽管这不是很重要。你认为有一个简单的解决方案吗?谢谢你的帮助。这也很好。但确实,它在缺少括号时不匹配。它应该能够在括号中使用表情符号,但在缺少括号时不应该匹配。这很难吗?嗯,仍然匹配缺少括号
用法:(当我试图解析它时可能会发生错误。我误解了。所以,匹配的括号不应该匹配,表情符号应该匹配?就像(?=\([a-z0-9\-]+:)(\((?:[)(]|[^()](?1))*+\)
()?就是这样。你怎么能写得这么好。我真的再次感谢你。