我有这条路线
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
哪种正则表达式路由排除了这种情况?
在whateever(。*)之前使用斜线的东西
"(a|a-b|b|c|d|d-a|d-b)(/)(.*)"
不起作用。
答案 0 :(得分:1)
您可以使用
routes.catalog.route = "^(a|a-b|b|c|d|d-a|d-b)(/.*)?$"
(/.*)?
部分匹配/
字符的1或0次出现(即可选),后跟除了换行符之外的任何0 +字符。这意味着,在您进行替换后(a
,a-b
等),必须有/
(后跟任何内容)或字符串结尾($
)。
为了使其更加紧凑和高效,您可以“收缩”它有点像
"^(d(?:-[ab])?|a(?:-b)?|[bc])(/.*)?$"
见this regex demo。但是,如果您认为可读性受到很大影响,您仍可以使用上面的表达式。
<强>详情
^
- 字符串开头(d(?:-[ab])?|
- d
可选地跟随-a
或-b
或a(?:-b)?|
- a
可选地跟随-b
[bc])
- b
或c
(/.*)?
- 可选的第2组匹配/
和任何0+字符$
- 字符串结束。