Regex для URL с несколькими параметрами

1

Я пытаюсь скомпилировать регулярное выражение для соответствия 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; 
    }
}
  • 0
    Вы, вероятно, должны будете использовать несколько регулярных выражений. 1) сопоставить и записать параметры пути и любые значения ключа get, 2) проанализировать параметры пути и записать каждое из них, 3) проанализировать значения ключа get и захватить каждое из них. Вот как я это сделаю.
Теги:
get

2 ответа

0

Спасибо за ваши ответы! Следующее regex закончило работать для меня:

/^\/param_1\/param_2\/...\/param_n\/?(\?.*)?$/
0

Сначала выберете все параметры и все ключи-валы отдельно:

                             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, но это должно указывать на вас в правильном направлении.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню