Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PCRE中的递归正则表达式和组搜索_Php_Regex_Recursion_Pcre - Fatal编程技术网

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

Php PCRE中的递归正则表达式和组搜索,php,regex,recursion,pcre,Php,Regex,Recursion,Pcre,我有一个这样的路由系统:website/:option:option:option或 网站/档案/:年/:月-:日/页/:页。表示可选路径;字符串表示将被替换的变量。在嵌套括号的情况下,我需要所有变量才能继续,因为括号的数量可能是无限的 我在PHP中使用PCRE。我需要选择所有:字符串,所以我考虑了这个正则表达式:\[^\\]*:[^\\]+\。我遇到递归和组正则表达式搜索的问题 示例:website/archive/2015/:month:day将选择/:month:day 示例:网站/arc

我有一个这样的路由系统:website/:option:option:option或 网站/档案/:年/:月-:日/页/:页。表示可选路径;字符串表示将被替换的变量。在嵌套括号的情况下,我需要所有变量才能继续,因为括号的数量可能是无限的

我在PHP中使用PCRE。我需要选择所有:字符串,所以我考虑了这个正则表达式:\[^\\]*:[^\\]+\。我遇到递归和组正则表达式搜索的问题

示例:website/archive/2015/:month:day将选择/:month:day 示例:网站/archive/:year/0327将选择/:year/0327

有人能给我解释一下递归是如何工作的吗?如果可以的话?

试试这个模式

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

阅读下面的注释后,使用此模式,对照子模式1进行检查

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

如果不是多行输入,您可以删除\r\n,有人能向我解释递归是如何工作的吗?递归比平均值要复杂,某种解释可能比发布原始模式更好。顺便说一句,你可以用\?:[^]++| R*\来优化它。这个模式的问题是,他还捕获了一个不包含:字符的字符串。举个例子:website/archive/2015/:month:day:年已设置,因此不需要捕获它,但未设置月,因此捕获将为/:month:day,如果设置了天而不是年:website/archive/:year/:month27,则捕获将保持为/:year/:month27。这就像嵌套的IF条件,如果第一个条件不满足,那么下一个条件就无法满足。@Fox,更新了我上面的答案!还有一些模式是正则表达式无法选择的:但现在他做了我想要的。所以问题已经解决了。谢谢