正则表达式匹配子模式结构

时间:2012-12-04 20:49:03

标签: php regex pcre

我正在测试一些正则表达式来处理子模式,所以我可以通过PHP为每个uri段定义规则。其中一些段是可选的,所以我尝试了这个:

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

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

1 个答案:

答案 0 :(得分:4)

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

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

请注意,在您的问题中,第二个捕获组无效,因为您有一个开放<而不是要关注的组名。我改变了,因为我认为这可能是问题中的错字。

如果采用与正则表达式不同的方法,它可能会大大提高代码的可读性。 / $result[1]怎么样?那么$result[2]就是你的控制者。然后你可以检查是否有$result[3]并检查它是否是一个有效的“项目”(或你称之为的任何内容)。然后,您可以检查是否有id,如果这是一个数字并将其用作{{1}}。这种方法可以轻松扩展到多个参数,并可以检查不同的允许项目。