Регулярное выражение для соответствия конкретным параметрам запроса в URL - PullRequest
0 голосов
/ 09 июня 2018

У меня есть URL (https://example.com? & IframeLoad = true & firstName = & lastName = & email = & phone1 = & address = & zipcode = 07307 & isAvailableReferral = true & isAvailableDirect = false )

Я пытаюсь заменитьимя, фамилия, адрес электронной почты, телефон, адресные поля, а не другие.

Это то, что я сейчас делаю, используя регулярное выражение (&? (firstName | lastName | email | phone1 | address) =? [^ &] *)

Это в основном выбирает «&», затем firstName | lastName | email | phone1 | address и также каждый символ после «=».Обратите внимание, что регулярное выражение не совпадает, если после символа «=» следует символ «&».

Я могу правильно выбрать каждое поле, но когда в URL есть «&» после «=», мое решение не соответствуетработать правильно, так как он выбирает значение только до символа "&".

Поскольку действительный адрес электронной почты может иметь символ "&".Мне нужно решение, в котором регулярное выражение выбирает, даже если после символа "=" стоит символ "&".

пример: & email = abc & xyz @ .com - в этом случае регулярное выражение выбирает только "& email = abc &"а не вся электронная почта.

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Возможно, вы захотите рассмотреть что-то вроде этого:

[&?]((?:firstName|lastName|phone1|address|zipcode)=|email=(?:.*@.*\.)?)[^&]*

Параметр email здесь рассматривается как особый случай - мы проверяем локальную часть, за которой следуют субдомен (ы), одновременно допускаяTLD без амперсанда (я считаю, что это безопасно - я не думаю, что TLD может содержать такие странные символы).Все остальные параметры обрабатываются нормально.Совпадения будут возвращены как пары имя = значение. См. Regex 101 здесь .

0 голосов
/ 09 июня 2018

В зависимости от спецификаций кодировки URL, эта задача может быть невозможно выполнить однозначно.Для того чтобы это было возможно, URL-адреса в наборе данных должны быть стандартизированы таким образом, чтобы после каждого параметра был знак равенства, а в значениях параметров не должно быть других случайных знаков равенства.Если оба эти условия выполняются, то будет работать следующее:

Регулярные выражения

&(firstName|lastName|email|phone1|address)=([^&]*(?:&[^&=]+(?=&|$))*)

Также обратите внимание, что это регулярное выражение работаетНе охватывают случаи, когда один из желаемых параметров является первым параметром.Поскольку регулярное выражение Javascript ограничено, и в любом случае это особый случай (начинающийся с ? вместо &), это нужно будет обрабатывать по-разному, в зависимости от того, что вы хотите сделать с параметрами.Совпадение следующего и замена на ? - это способ удалить параметр:

\?(firstName|lastName|email|phone1|address)=([^&]*(?:&[^&=]+(?=&|$))*)(?:&|$)

Если вы не планируете полностью удалить параметр,(?:&|$) в конце выражения может быть удален для простоты.

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

Как это работает

Хитрость здесь в том, чтобы иметь отдельную группу без захвата (?:&[^&=]+(?=&|$))*, которая обрабатывает дополнительные части строки параметра с необработанными амперсандами, но не равнызнак.Класс символов [^&=]+ гарантирует, что подвыражение не имеет амперсандов или знаков равенства, а предварительный просмотр (?=&|$) гарантирует, что за строкой следует другой параметр или конец строки, а не знак равенства.Вся группа имеет квантификатор *, так как он может появляться ноль, один или несколько раз после исходного параметра.

Также обратите внимание, что для удобства значения имени и значения параметра хранятся в группы захвата 1 и 2, для легкого доступа и анализа.Если вы не планируете использовать значения, их можно заменить на группы без захвата, добавив ?: после (.

Отказ от ответственности

Если какие-либо параметры отсутствуютзнак равенства, нет никакого способа однозначно устранить неоднозначность новых параметров url из значений для предыдущего параметра url, поскольку в примере https://example.com?&iframeLoad=true&email=abc&xyz@.com это может относиться либо к одному параметру с именем email со значением abc&xyz@.com, либо к двумпараметры с именами email и xyz@.com (если только список строк параметров и список строк значений не стандартизированы, но на этом пути лежит безумие).Подобным образом, случайные знаки равенства обманывают парсер.Как упоминал @David Faber, обычно символ & в URL-адресе кодируется в URL-адресе как %26, чтобы полностью исключить эту неоднозначность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...