Анализ параметров URL-запроса с использованием регулярного выражения

Я хотел бы разумно анализировать параметры запроса URL-адреса, используя регулярное выражение.

То, что я должен был учитывать: 1) параметры могут быть не в порядке 2) только определенные параметры должны совпадать

Учитывая строку запроса: «? Param1 = test1 & param2 = test2 & parm3 = test3», я хотел бы запустить регулярное выражение javascript для анализа значения param1 и param3.

Регулярное выражение, которое я придумал до сих пор:

/(?:[?&](?:param1=([^&]*)|param3=([^&]*)|[^&]*))+$/g

Мне кажется, это регулярное выражение отлично работает на таких сайтах, как https://regex101.com/.

Однако, когда я запускаю приведенный ниже метод JS, я всегда получаю undefined для $ 2, что и должно быть для парсинга значения param1. Любая помощь или предложение?

"?param1=test1&param2=test2&param3=test3".replace(
/(?:[?&](?:param1=([^&]*)|param3=([^&]*)|[^&]*))+$/g,
 function ($0, $1, $2, $3) { return $0 + ' ' + $1 + ' ' + $2 + ' ' + $3; });

Это возвращает $ 2 как undefined и $ 3 как test3. Однако, если я исключу как param2, так и param3 из строки запроса url, я смогу успешно проанализировать param1 как $ 2. Немного запутался в этом.

Благодарность!


person Richard Lee    schedule 05.11.2016    source источник
comment
Добавить с тегом javascript   -  person prasanth    schedule 05.11.2016
comment
Каков ваш ожидаемый результат замены?   -  person Damon    schedule 05.11.2016
comment
Я бы хотел, чтобы $ 0 и $ 1 выводили "test1" и "test3", это может быть ограничение javascript: stackoverflow.com/questions/3537878/   -  person Richard Lee    schedule 05.11.2016
comment
Вы находите эти группы захвата, но это регулярное выражение СОВПАДАЕТ только один раз. Я до сих пор не понимаю, каков ваш ожидаемый результат этой операции. Вы хотите извлечь значения из параметров 1 и 3 в массив, например ['test1', 'test3'], или вы хотите их заменить? Вы хотите заменить всю строку?   -  person Damon    schedule 05.11.2016
comment
Javascript replace заменит только совпавший текст на возвращаемое значение обратного вызова. Эта группа захвата не определена, потому что вы получаете доступ только к последнему повторению этой группы чередования. tl; dr - я не вижу, чтобы это регулярное выражение решало какие-либо проблемы реального мира в том виде, в котором оно написано. Вы должны предоставить нам ожидаемый результат для любой значимой помощи :).   -  person Damon    schedule 05.11.2016


Ответы (2)


.*parameterName=([^&|\n|\t\s]+)

Использование этого шаблона даст вам в группе значение параметра. Например, для этого URL: https://www.youtube.com/watch?v=aiYpDDHKy18&list=RDaiYpDDHKy18&start_radio=1

.*list=([^&|\n|\t\s]+)

вы получите: идентификатор списка: "RDaiYpDDHKy18"

.*start_radio=([^&|\n|\t\s]+)

даст вам номер 1.

person David Rechtman    schedule 11.09.2019

Если они расположены в произвольном порядке, вы можете использовать просмотр вперед, чтобы найти их и зафиксировать значения параметров. Шаблон, который вам нужен (для вашей тестовой строки), таков:

^(?=.*param1=([^&]+)|)(?=.*param2=([^&]+)|)(?=.*param3=([^&]+)|).+$

Демонстрация на Regex101

Он также будет принимать строки запроса, в которых отсутствуют параметры, потому что каждый просмотр вперед чередуется либо с парой параметр / значение, либо с пустой строкой, используя |s в конце.

Вам понадобится дополнительный просмотр вперед для каждого параметра, который вы надеетесь получить, и этого не избежать. Поскольку каждое регулярное выражение под солнцем - это машина состояний под капотом, единственное, что вы собираемся использовать ваш исходный шаблон - последнее совпадение для данной группы захвата.

person Sebastian Lenartowicz    schedule 05.11.2016