Я пытаюсь сделать маршрутизатор с истинным соответствием с помощью регулярного выражения, но я всегда зациклился на том, как загружаются маршруты.Regex True Match Behavior
Если у меня есть маршруты, как
- /: любой
- /блог /: любой
- /блог/категория /: любой
Первый маршрут будет всегда сбываются вместо использования второго маршрута или третьего.
$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'];
Как я могу сделать регулярное выражение/preg_match, чтобы получить правильный матч маршрут?
Возможно, было бы полезно показать, как «$ this-> routes», '$ this-> tokens' и' $ url' заполняются или, по крайней мере, примерные значения для всех этих переменных, чтобы лучше понять, что такое происходит. –
Я думаю, что прямо, как дела, но я добавил их тоже. – Filipe