Я пытаюсь построить функцию маршрутизатора, чтобы правильно сопоставлять входящие URI и сопоставлять их с массивом хранимых системных URI.У меня также есть символы подстановки '(: any)' и '(: num)', похожие на CodeIgniter.
По сути, я пытаюсь получить запись «admin / stats / (: num)» для соответствия как «admin / stats», так и admin / stats / 1 ».
Хотязапускается скрипт Я беру все пути из отдельного массива и использую foreach для сохранения каждого пути:
route('admin/stats/(:num)', array('#title' => 'Statistics',...));
Функция:
function route($path = NULL, $options = NULL) {
static $routes;
//If no arguments are supplied, return all routes stored.
if(!isset($path) && !isset($options)) {
return $routes;
}
//return options for path if $path is set.
if(isset($path) && !isset($options)) {
//If we have an exact match, return it.
if(array_key_exists($path, $routes)) {
return $routes[$path];
}
//Else, we need to use RegEx to find the correct route options.
else {
$regex = str_replace('/', '\/', $path);
$regex = '#^' . $regex . '\/?$#';
//I am trying to get the array key for $route[$path], but it isn't working.
// route_replace('admin/stats/(:num)') = 'admin/stats/([0-9]+)'.
$uri_path = route_replace(key($routes[$path])); //route_replace replaces wildcards for regex.
if(preg_match($regex, $uri_path)) {
return $routes[$path];
}
}
}
$routes[$path] = $options;
return $routes;
}
Функция замены маршрута:
function route_replace($path) {
return str_replace(':any', '.+', str_replace(':num', '[0-9]+', $path));
}
Пара ключ / значение в массиве $ routs выглядит следующим образом:
[admin/stats/(:num)] => Array
(
[#title] => Statistics //Page title
[#access] => user_access //function to check if user is authorized
[#content] => html_stats //function that returns HTML for the page
[#form_submit] => form_stats //Function to handle POST submits.
)
Спасибо за помощь.Это мой первый маршрутизатор, и я не настолько знаком с созданием правильных регулярных выражений.