Php 要匹配子模式结构的正则表达式

Php 要匹配子模式结构的正则表达式,php,regex,pcre,Php,Regex,Pcre,我正在测试一些正则表达式来处理子模式,这样我就可以通过PHP应用为每个uri段定义的规则。其中一些片段是可选的,因此我尝试了以下方法: preg_match('#^/(?P<controller>[\w-]+)(?:/(?P<[\w-]+)(?:/(?P<id>[\d]+)))/?$#uD', '/blog/post', $matches); 这个正则表达式匹配/blog/post/1,但不匹配blog/post,因为第二个和第三个参数都是可选的。有什么线索吗?为

我正在测试一些正则表达式来处理子模式,这样我就可以通过PHP应用为每个uri段定义的规则。其中一些片段是可选的,因此我尝试了以下方法:

preg_match('#^/(?P<controller>[\w-]+)(?:/(?P<[\w-]+)(?:/(?P<id>[\d]+)))/?$#uD', '/blog/post', $matches);

这个正则表达式匹配/blog/post/1,但不匹配blog/post,因为第二个和第三个参数都是可选的。有什么线索吗?

为什么第二部分和第三部分是可选的?没有?这使得它们是可选的。这个您所做的修改仅应用于最后一个斜杠。此外,如果存在第二个组,则需要确保第三个组仍然是可选的。也许你在找这样的东西:

'#^/(?P<controller>[\w-]+)(?:/(?P<item>[\w-]+)(?:/(?P<id>[\d]+))?)?/?$#uD'

请注意,在您的问题中,第二个捕获组无效,因为您有一个开口,为什么第二个和第三个部分是可选的?没有?这使得它们是可选的。这个您所做的修改仅应用于最后一个斜杠。此外,如果存在第二个组,则需要确保第三个组仍然是可选的。也许你在找这样的东西:

'#^/(?P<controller>[\w-]+)(?:/(?P<item>[\w-]+)(?:/(?P<id>[\d]+))?)?/?$#uD'

请注意,在您的问题中,第二个捕获组无效,因为您有一个开口。您确定第二个和第三个组是可选的吗?我看到您使用的是look aehead?:,但要使它们成为可选的,则需要一个“@FrankvanPuffelen?”:不是前瞻性的,而是非捕获组。@m.buettner:谢谢。我总是把各种构造名称弄混它们都不是可选组?不过,我把那个部分搞对了。@AndyLester,不是XML@AndyLesterURI XML如何?您确定第二组和第三组是可选的吗?我看到您使用的是look aehead?:,但要使它们成为可选的,则需要一个“@FrankvanPuffelen?”:不是前瞻性的,而是非捕获组。@m.buettner:谢谢。我总是把各种构造名称弄混它们都不是可选组?不过,我把那个部分搞对了。@AndyLester,不是XML@AndyLesterURI XML是什么?