我正在测试一些正则表达式来处理子模式,这样我就可以通过 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'
请注意,在您的问题中,第二个捕获组无效,因为您有一个开头<
而不是组名要遵循。我改变了它,因为我认为这可能是问题中的错字。
但是,如果您采用与正则表达式不同的方法,它可能会大大提高代码的可读性。怎么爆炸/
。_ 然后$result[1]
将是您的控制器。然后你可以检查是否有一个$result[2]
并检查它是否是一个有效的“项目”(或者你称之为的任何东西)。然后你可以检查是否有$result[3]
, 如果那是一个数字并将其用作你的id
. 这种方法很容易扩展到多个参数,并检查不同的允许项。