Php: сопоставьте URL-адрес с использованием регулярного выражения и извлеките значения, если шаблон соответствует

Привет, я изучаю динамические 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)

См.: github.com/thecodeholic/php-mvc-фреймворк TheCodeholic создал потрясающую инфраструктуру PHP MVC здесь. Там же можно найти собственную реализацию маршрутизатора и стратегии разбора параметров маршрутизатора.

Ar Rakin 20.03.2022 15:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете преобразовать свои маршруты в регулярные выражения с именованными группами захвата:

$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}.

Другие вопросы по теме