我正在测试一些正则表达式来处理子模式,所以我可以通过PHP为每个uri段定义规则。其中一些段是可选的,所以我尝试了这个:
preg_match('#^/(?P<controller>[\w-]+)(?:/(?P<[\w-]+)(?:/(?P<id>[\d]+)))/?$#uD', '/blog/post', $matches);
此正则表达式匹配/blog/post/1
但未匹配blog/post
,因为第二个和第三个参数都是可选的。有线索吗?
答案 0 :(得分:4)
为什么第二和第三部分是可选的?没有?
使它们成为可选项。您拥有的?
仅适用于最后一个斜杠。此外,如果存在第二组,则需要确保第三组仍然是可选的。也许你正在寻找这样的东西:
'#^/(?P<controller>[\w-]+)(?:/(?P<item>[\w-]+)(?:/(?P<id>[\d]+))?)?/?$#uD'
请注意,在您的问题中,第二个捕获组无效,因为您有一个开放<
而不是要关注的组名。我改变了,因为我认为这可能是问题中的错字。
如果采用与正则表达式不同的方法,它可能会大大提高代码的可读性。 /
$result[1]
怎么样?那么$result[2]
就是你的控制者。然后你可以检查是否有$result[3]
并检查它是否是一个有效的“项目”(或你称之为的任何内容)。然后,您可以检查是否有id
,如果这是一个数字并将其用作{{1}}。这种方法可以轻松扩展到多个参数,并可以检查不同的允许项目。