在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