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组模式(递归)
    • \)
      -
如果您还想支持smileys,您可以在regex子例程所在的替换组中添加它们的特定模式,作为第一个替换:

(?=\([a-z0-9_-]+:)(\((?::[)(]|[^()]|(?1))*+\))
                        ^^^^^  
我在
[^()]
之后添加了与
:)
:(
匹配的
:[)(]
,并删除了
+
,以便能够逐个字符检查嵌套括号内的字符串

您可以根据自己的需要随意调整或添加


请参见带有
(?=\([a-z0-9+]:)(\((?::(?:[()pPDd*oO]|')\()|你不能只匹配整个标记,然后用PHP拆分字符串处理它吗?@Justinas我只处理标记,而不是在每个括号内。当然,我们使用缺少的括号不匹配。但是当我们使用表情符号时,它不匹配,尽管这不是很重要。你认为有一个简单的解决方案吗?谢谢你的帮助。这也很好。但确实,它在缺少括号时不匹配。它应该能够在括号中使用表情符号,但在缺少括号时不应该匹配。这很难吗?嗯,仍然匹配
缺少括号
用法:(当我试图解析它时可能会发生错误。我误解了。所以,
匹配的括号不应该匹配,
表情符号应该匹配?就像
(?=\([a-z0-9\-]+:)(\((?:[)(]|[^()](?1))*+\)
()?就是这样。你怎么能写得这么好。我真的再次感谢你。