我尝试使用正则表达式进行真正匹配的路由器,但我总是陷入路由加载的方式。
如果我有像
这样的路线第一条路线将永远实现,而不是使用第二条路线或第三条路线。
$data = array();
foreach($this->routes as $route => $rData) {
if(strpos($route, ':') !== false) {
foreach($this->tokens as $token => $value) {
$route = str_replace($token, $value, $route);
}
}
if(preg_match('#^'.$route.'$#', $url, $matches)) {
$data['params'] = array_slice($matches, 1);
$data = array_merge($rData, $data);
break;
}
}
路线:
$routes = array(
'/:any' => callback,
'/blog/:any' => callback,
'/blog/category/:any' => callback
);
令牌:
$tokens = array(
':num' => '([0-9]+)',
':any' => '(.+)'
);
地址:
$url = $_SERVER['QUERY_STRING'];
如何使用regex / preg_match来获得正确的路由匹配?
答案 0 :(得分:0)
通常情况下,在这种情况下,路线规则的编写方式应使下列内容比前一个更为通用。他们在第一场比赛中
Yoy应该这样写:
$routes = array(
'/blog/category/:any' => callback
'/blog/:any' => callback,
'/:any' => callback,
);
这不是代码错误。它只是执行逻辑
更新源自与问题作者的讨论
假设我们想要找到具有最大段数的匹配项:
$routes = array(
'/:any' => 'callback1',
'/blog/:any' => 'callback2',
'/blog/category/:any' => 'callback'
);
foreach ($routes as $in => $out)
$counts[$in] = count(explode('/', $in));
arsort($counts);
foreach ($counts as $in => $count)
$newroutes[$in] = $routes[$in];
var_dump($newroutes);
返回
array(3) {
["/blog/category/:any"]=>
string(8) "callback"
["/blog/:any"]=>
string(9) "callback2"
["/:any"]=>
string(9) "callback1"
}
然后使用此newroutes
数组