Привет, я изучаю динамические URL-адреса в php для создания собственного маршрутизатора.
я устанавливаю маршруты, используя этот метод
$router->get("/home",function(){
echo "this is home";
});
Раньше я не думал, что первый параметр (мой путь к маршрутизатору) get() также может быть записан
как /profile/{user}/id/{id}
Я попытался использовать регулярное выражение для пути в get() и использовать preg match для возврата значения
но не доволен выводом, так как он требует регулярного выражения каждый раз, когда я устанавливаю новый маршрут
Я хотел бы знать, как бы я просто установил маршрут, например
/profile/{user}/id/{id}
или /profile/{var : user}/id/{int : id}
и и получить вывод, как
если совпадение с шаблоном маршрута возвращает массив со значением ключа, где ключ — это пользователь, а значение — из строки и т. д.
определенные маршруты : запрошенные маршруты : вывод
/home form action : /home o/p = array()
/home/{page} form action : /home/about o/p = array(page=>'about')
/profile/{name}/id/{id} form action : /profile/stackuser/id/200 o/p = array(name=>stackuser,id=>200)
Вы можете преобразовать свои маршруты в регулярные выражения с именованными группами захвата:
$routes = [
'/profile/{user}/id/{id}',
'/this/will/not/match/for/sure',
];
$routes_regexps = array_map(
function($route){
return
'#^' // RE delimiter and a string start
/* Translate
{something}
substrings into regexp named matches like
(?<something>[^/]+)
*/
. preg_replace("/\{(.*?)\}/", '(?<$1>[^/]+?)', $route)
. '$#' ; // String end and a RE delimiter
},
$routes
);
А затем сопоставьте путь URL через эти RE:
$test_urls = [
'/profile/some_username/id/25',
'/this/will/not/match'
];
foreach( $routes_regexps as $i => $re ){
print "Route is: {$routes[$i]}\n";
print "RE is: $re\n";
foreach( $test_urls as $url ){
$matches = [];
if ( preg_match_all($re,$url,$matches) ){
print "Url [$url] did match the route, variables are: \n";
print "User: {$matches['user'][0]}\n";
print "id: {$matches['id'][0]}\n";
} else {
print "Url [$url] didn't match\n";
}
}
}
Но я бы предпочел преобразовать оба маршрута и путь URL в массивы и сравнить элемент за элементом, проверяя, является ли компонент маршрута чем-то вроде {variable name here}
.
См.: github.com/thecodeholic/php-mvc-фреймворк TheCodeholic создал потрясающую инфраструктуру PHP MVC здесь. Там же можно найти собственную реализацию маршрутизатора и стратегии разбора параметров маршрутизатора.