Я пытаюсь скомпилировать регулярное выражение для соответствия URL-адресу в следующей форме:
http://www.example.com/param_1/param_2/.../param_n/?var_1=val_1&var2_=val_2&...val_n=var_n
Другими словами, URL-адрес будет иметь несколько поддиректорий (param_1 - param_n), которые должны быть явно сопоставлены, и неизвестное количество переменных GET, которые необходимо переносить вместе с URL-адресом без аннулирования соответствия.
(Я видел другие темы для сопоставления одной или двух или трех переменных GET, но не для общего выражения регулярного выражения, совпадающего с несколькими переменными, общее число которых неизвестно)
У меня есть следующее Regex, работающее по следующему URL-адресу:
URL: http://www.example.com/users/john/
REGEX: "users\/john\/([a-z|A-Z|0-9|-]+)([\/]{0,1})\/([a-z|A-Z|0-9|-]+)([\/]{0,1})$/"
RESULT: MATCH!! :)
Но добавление переменных "GET" (http://www.example.com/users/john/?car=blue) не приводит к совпадению (очевидно).
Я не гуру регулярных выражений и не уверен, что я работаю, возможно, не очень изящный, но мне не повезло, что он работает с дополнительными переменными.
Я сопоставляю шаблоны следующим образом:
$routes = array(~~ REGEX => controller script ~~);
foreach($routes as $pattern=>$ctrl){
if(preg_match($pattern, URI)) {
echo 'MATCH!!';
break;
}
}
Спасибо за ваши ответы! Следующее regex закончило работать для меня:
/^\/param_1\/param_2\/...\/param_n\/?(\?.*)?$/
Сначала выберете все параметры и все ключи-валы отдельно:
key-vals vvvv
^https?:\/\/[^\/]+((?:\/[^?]+)*)?(?:\?(.+))?$
^^^^^^^^^^^^^^^ params
Для примера url, params = /param_1/param_2/.../param_n
и key-vals = var_1=val_1&var2_=val_2&...val_n=var_n
.
Если параметры были извлечены, получите каждый отдельный параметр (используйте глобальное значение для каждого):
\/([^\/]+)
^^^^^^^^ individual param
Если ключ-валы были извлечены, получите каждый отдельный ключ и значение (также используйте глобальные):
vvvvvvv value
([^=]+)=([^&]+)
^^^^^^^ key
Извините, я не могу помочь с PHP, но это должно указывать на вас в правильном направлении.