在PHP中,klein路由将匹配尽可能多的路由。 我建立的2条路线有冲突。它们是:正则表达式匹配url
$route1: '/websites/[i:websiteId]/users/[i:id]?'
和
$route2: '/websites/[i:websiteId]/users/[a:filename].[json|csv:extension]?'
这是我想匹配的URL,这是我认为应该匹配第一个而不是第二,就是:
/api/v1-test/websites/100/users/4
这两个产生的正则表达式是:
$regex1: `^/api(?:/(v1|v1-test))/websites(?:/(?P<websiteId>[0-9]++))/users(?:/(?P<id>[0-9]++))?$`
$regex2: `^/api(?:/(v1|v1-test))/websites(?:/(?P<websiteId>[0-9]++))/users(?:/(?P<filename>[0-9A-Za-z]++))(?:\.(?P<extension>json|csv))?$`
我的意思是它不匹配,如果没有'.csv'或'.json'。问题是它匹配两条路线。对于第二个,结果文件名是'4',扩展名是空白的。
正在发送/api/v1-test/websites/100/users/users.csv,它只能匹配第二条路由。
我只能控制路线,而不是正则表达式或匹配。 谢谢。
我不太喜欢这个当我第一次阅读时回答。我天真的理解是,说这之后的任何事情都是作为参数。 –
你说得对吗?可以用来[标签子模式](http://www.php.net/manual/en/regexp.reference.subpatterns.php)。但碰巧在PHP正则表达式语法中(Klein路由系统使用的),问号有多种用法。最后 ?在你的路线被解释为'0或1'[元字符](http://www.php.net/manual/en/regexp.reference.meta.php)。 – jmeas
事实上,[Klein自述文件](https://github.com/chriso/klein.php#routing)中的最后一个路由示例与您所描述的路径有非常相似的路由,明确地说它会导致选项文件扩展名。如果你想让route2需要扩展名,你应该删除尾部的'?'。 – jmeas