#php #regex
#php #регулярное выражение
Вопрос:
У меня есть маршрут URI, например:
/dir/:dir1/:val1-:val2
Мне нужно регулярное выражение, чтобы:
- Узнайте, соответствует ли маршрут реальному URI (например, /category/cars/ferrari-10)
- Получите параметры и значения следующим образом:
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); }