Как получить значения / параметры из регулярного выражения?

#php #regex

#php #регулярное выражение

Вопрос:

У меня есть маршрут URI, например:

 /dir/:dir1/:val1-:val2
 

Мне нужно регулярное выражение, чтобы:

  1. Узнайте, соответствует ли маршрут реальному URI (например, /category/cars/ferrari-10)
  2. Получите параметры и значения следующим образом:

    dir1 => автомобили

    val1 => ferrari

    val2 => 10

Как выполнить эту работу?

Спасибо!

Ответ №1:

Использование именованных групп регулярных выражений и preg-match :

 $test = "/category/cars/ferrari-10";
$result = preg_match("/^/[^/] /(?P<dir1>[^/] )/(?P<val1>[^-] )-(?P<val2>[^/] )$/", $test, $matches);
print_r($matches);
 

Приведенное выше приведет к следующему массиву:

 Array
(
    [0] => /category/cars/ferrari-10
    [dir1] => cars
    [1] => cars
    [val1] => ferrari
    [2] => ferrari
    [val2] => 10
    [3] => 10
)
 

Кроме того, если вы хотите удалить неназванные группы, вы можете использовать следующее:

 for ($i = 0; $i < count($matches); $i  ) {
  unset($matches[$i]);
}
 

Ссылки:

Комментарии:

1. можно ли автоматически удалить [1] => автомобили [2] => ferrari и [3] => 10 ?

2. нет, но зачем вам такая функция? Если они вам не нужны, просто не используйте их

3. кроме того, читаемость регулярных выражений можно улучшить, изменив разделитель строк на что-то другое, кроме «/», тогда вы могли бы изменить все эти «/» на более простое «/» 🙂

4. @pomeh, мне это нужно, потому что я должен отправить эти параметры / значения в функцию, но я должен отправить этот чистый массив. Может быть, автоматически удалить все нечетные 🙂

5. @Dail: Нет, preg_match не поддерживает это. Однако вы можете использовать простой цикл для удаления нежелательных элементов. Смотрите мое обновление.

Ответ №2:

Регулярное выражение может быть излишним. Может быть проще, если вы разделите все значения на / , а не смешиваете / с - .

Тогда вы могли бы использовать простой explode.

 $param_array = explode('/', $original_uri);
 

Затем вы можете отменить смещение каждого значения с начала массива, чтобы получить отдельные значения для тестирования маршрута.

 $controller = array_unshift($param_array);
$action = array_unshift($param_array);
$args = $param_array;
 

Комментарии:

1. это то, что я делаю. самый простой. если они все еще хотели использовать - для разделения аргументов, то установите $args = array_unshift($param_array); if($args){ $args = explode('-', $args); }