1

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

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

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

4

1 回答 1

4

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

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

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

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

于 2012-12-04T20:54:02.810 回答