Захват определенных параметров URL в PHP - PullRequest
1 голос
/ 16 сентября 2011

У меня есть следующий код:

$url = 'http://www.domain.tld/go.jsp?a1=valuea1&b2=valueb2&c3=valuec3';
preg_match($regex, $url, $result);

Мне нужно $ regex, которое при применении к $ url возвращает в $ result тот же URL, но только с параметрами, выбранными в регулярном выражении.Например, регулярное выражение с (альтернативным | селектором) для параметров, которые должны быть извлечены, вместе с остальной частью URL.Конечно, имя и значения параметров могут быть любыми стандартом.?и использование в результате может быть неправильным.Например, если я хочу получить параметры b2 и c3, это допустимо:

'http://www.domain.tld/go.jsp&b2=valueb2&c3=valuec3'

Кроме того, я знаю, что $ result является массивом, и я не против, чтобы URL-адрес был «распределен»некоторые предметы в нем.

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 16 сентября 2011

Используйте parse_url, чтобы получить часть строки запроса URL; и parse_str для разбора строки запроса:

$query = parse_url($url, PHP_URL_QUERY);
parse_str($query, $params);

var_dump($params);

Вы можете манипулировать $ params по своему усмотрению и собирать его в строку запроса с помощью функции http_build_query:

$query = http_build_query($params);

Теперь, используя регулярное выражение:

$url = preg_replace('/^
    ([^?#]+)            # everything except the query and #hash
    \?                  # the ?
    [^#]*?              # unwanted params
    \bparam_a=([^&#]+)  # param_a
    [^#]*?              # unwanted params
    \bparam_b=([^&#]+)  # param_b
    [^#]*?              # rest of query
    (\#.*)?             # optional #hash
    $/x', '\1?param_a=\2&param_b=\3\4', $url);

Это работает, только если param_a и param_b появляются в этом порядке ; предпочитаю решение parse_url / parse_str;)

0 голосов
/ 16 сентября 2011

Вот простое предложение для одного параметра для фильтрации, чтобы вы поняли:

'/(.+?) # capture everything before the filtering parameter
([&\?]?) # takes care of the initial parameter prefix
(c3=[^&$]*)&? # capture the c3 parameter to filter
(.*) # captures the rest/mx'

Строка замены:

 '$1$2$4'

ТамЭто небольшая оговорка, если она захватывает последний параметр, то там будет слишком много трейлинга &, но вы упомянули, что это не было проблемой в отправленном вами вопросе.применить preg_match для каждого параметра для фильтрации.

...