目录的动态路由

Dynamic route for catalog

我有这条路线

routes.catalog.type = "Zend_Controller_Router_Route_Regex"
routes.catalog.route = "(a|a-b|b|c|d|d-a|d-b)(.*)"
routes.catalog.defaults.controller = "category"
routes.catalog.defaults.action = "index"

正确匹配:

http://www.example.com/a
http://www.example.com/a/some-param/2

但很糟糕:

http://www.example.com/ab

哪个正则表达式路由排除这种情况?

在任何 (.*) 之前带有斜杠的内容,例如

"(a|a-b|b|c|d|d-a|d-b)(/)(.*)"

无效。

您可以使用

routes.catalog.route = "^(a|a-b|b|c|d|d-a|d-b)(/.*)?$"

(/.*)? 部分匹配 1 次或 0 次出现(即它是可选的)的 / 字符,后跟除换行字符以外的任何 0+ 个字符。这意味着,在您的交替(aa-b 等)之后,必须有 /(后跟任何内容)或字符串结尾 ($).

为了更简洁高效,你可以"shrink"有点像

"^(d(?:-[ab])?|a(?:-b)?|[bc])(/.*)?$"

参见 this regex demo。但是,如果您认为可读性大打折扣,您仍然可以使用上面的表达式。

详情

  • ^ - 字符串开头
  • (d(?:-[ab])?| - d 后跟 -a-b
  • a(?:-b)?| - a 后跟 -b
  • [bc]) - bc
  • (/.*)? - 一个可选的组 2 匹配 / 和任何 0+ 个字符直到
  • $ - 字符串结尾。