Сопоставить или все элементы внутри фигурных скобок и сопоставить их с заданной строкой

У меня такая проблема:

Например, у меня есть этот тест виртуального URL / {параметр1} / {параметр2} / {параметр3} /

и я хочу извлечь из следующих реальных URL-адресов значения, соответствующие именам параметров из виртуального URL-адреса, и сопоставить их с именами параметров в массиве:

/ тест / abc / def / ghi / Должен вернуть следующий результат:

[
"paramter1" => "abc",
"paramter2" => "def",
"paramter3" => "ghi",
]

/ тест / abc / def / Должен вернуть следующий результат:

[
"paramter1" => "abc",
"paramter2" => "def",
]

Для этого у меня есть следующие 2 функции. Один для извлечения и один для сопоставления.


    public static function processUrl($virtualUrl, $realUrl)
    {
    $realUrlRegex = preg_replace_callback('~\{([^{}]+)\}~',
    function ($matches)
    {
      $repl = '([^)]+)';
      self::$tmp[] = $matches[1];
      return $repl;
    }
    , $virtualUrl);
    print_r(self::$tmp);
    $UrlArray = array();
    $matches = array();
    $realUrlRegex = str_replace('/', '/', $realUrlRegex);

    if (preg_match("/^" . $realUrlRegex . "$/", $realUrl, $matches))
    {
      print_r($matches); 
      for ($i = 0; $i < count(self::$tmp); $i++)
      {
        if (isset($matches[$i + 1])){
          $UrlArray[self::$tmp[$i]] = $matches[$i + 1];
        }
      }
      $matches = array();
      self::$tmp = array();
      return $UrlArray;
    }
    self::$tmp = array();
    return false;
    }

    
  

    public function mapUrl($route, $request)
    { 
    $dynamicParameters = $route->getDynamicParameters() ;
    $mappedUrl = preg_replace_callback('/{{([^}]+)}}/', function ($m) use ($dynamicParameters) {
      return $dynamicParameters[$m[1]]; }, $request->getUrl());
    return $mappedUrl;
    }

Для этого у меня есть следующие 2 функции. Один для извлечения и один для сопоставления.

Например, 1 он работает нормально, но если один из виртуальных параметров отсутствует в реальном URL-адресе, совпадение preg не возвращает никаких результатов, и URL-адрес обрабатывается неправильно.

Почему бы не использовать explode? Если вам нужно регулярное выражение для поиска всех частей между косыми чертами после /test/, вы можете использовать preg_match_all('~(?:\G(?!\A)/|^/test/)\K[^/]+~', $request->getUrl(), $matches), см. демонстрация.

Wiktor Stribiżew 31.03.2021 18:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
0
1
21
0

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