PCRE 中的递归正则表达式和组搜索

Recursive regex and group searching in PCRE

我有一个这种形式的路由系统:website/(:option)(:option)(:option(:option)) 或者 website/archive(/:year(/:month(-:day))) (/page/:page)( ) 表示可选路径,:string 表示将被替换的变量。在嵌套括号的情况下,我需要所有变量继续(可能有 unlimited 个括号)。

我在 PHP 中使用 PCRE。我需要 select 所有 (:string),所以我想到了这个正则表达式:\([^\(\)]*:[^\(\)]+\)。我遇到递归和组正则表达式搜索问题。

示例:website/archive(/2015(/:month(:day))) 将 select (/:month(:day))
示例:website/archive(/:year(/03(27))) 将 select (/:year(/03(27)))

Regexr

有人可以向我解释递归是如何工作的吗?是否可以这样做?

试试这个模式

(\((?:[^()]|(?R))*\))

Demo


阅读下面的评论后,使用此模式,检查子模式 #1

\(([^():\r\n]*:[^()]+(\((?:[^()]|(?2))*\))\))

Demo
如果不是多行输入

,你可以删除\r\n