Регулярное выражение для сопоставления нескольких пар параметр/значение строки запроса

StackOverflow https://stackoverflow.com/questions/895279

  •  23-08-2019
  •  | 
  •  

Вопрос

Собираюсь разобраться с этим, но подумал, что, возможно, кому-то уже приходилось этим заниматься, так что...

Я ищу элегантное (и совместимое с перезаписью isapi) регулярное выражение для поиска трех известных пар параметр/значение в строке запроса, независимо от порядка, а также для извлечения всех остальных параметров, одновременно удаляя эти три.

абв=123 защита=456 и гхи=789 всем известные фиксированные строки.Они могут появляться в строке запроса в любом порядке и могут быть или не быть единственными параметрами, могут быть, а могут и не быть соседними.Оно должно быть умным и не соответствоватьаабв=123 или абв=1234 (поэтому каждый искомый параметр должен быть заключен в квадратные скобки &, ?, # или конец строки).Результат, который мне нужен, — это новая строка запроса с удаленными остальными параметрами.

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

Нет правильного решения

Другие советы

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

s/(\?|\#|\&)(abc=123|def=456|ghi=789)(\&|\#|$)//g

Это приблизительно и непроверено, но представляет собой рабочую (я думаю) концепцию.По сути, ищите начальную границу, буквальную струну, затем заканчивая границу, заменив каждую на ноль, глобально и используя | дать альтернативные варианты для каждого.

Вот что я придумал:

RewriteRule ^/oldpage.htm\?(.\*)(?<=\?|&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:(?:abc=123|def=456|ghi=789)(?:&|#|$))(.\*) /newpage.htm?$1$2$3  [I,RP,L]

который, я думаю, работает.квалификаторы LookAhead/lookbehind (?<= и (?= ), по-видимому, являются ключом к тому, чтобы я мог искать охватывающие & или ?не «потребляя его», чтобы испортить следующий матч.

Одна из ошибок заключается в том, что если старый URL-адрес страницы имеет только три параметра, я все равно получаю конечный ?без параметров в перенаправленном URL-адресе «/newpage.htm?».В настоящее время я планирую избежать этого, используя RewriteCond, чтобы просматривать только URL-адреса с 4+ параметрами до того, как это сработает, и иметь более простое регулярное выражение для совпадений для тех, у кого ровно три... так что полный набор правил выглядит следующим образом:

RewriteCond URL ^/oldpage.htm\?([^#]\*=[^#]\*&){3,}[^#]\*=[^#]\*.\*

RewriteRule ^/oldpage.htm\?(.\*)(?<=\?|&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:(?:abc=123|def=456|ghi=789)(?:&|#|$))(.\*) /newpage.htm?$1$2$3  [I,RP,L]

RewriteRule ^/oldpage.htm\?(?:abc=123|def=456|ghi=789)&(?:abc=123|def=456|ghi=789)&(?:abc=123|def=456|ghi=789)(.\*) /newpage.htm$1 [I,RP,L]

(1 доллар в конце предназначен для #дополнений к URL-адресу... действительно ли он мне нужен?) Другая проблема заключается в том, что я полагаю, что URL-адрес /oldpage.htm?abc=123&abc=123&abc=123 может вызвать это, но я не вижу простого пути решения этой проблемы и не слишком беспокоюсь по этому поводу..

Может ли кто-нибудь придумать лучший способ подойти к этому или увидеть какие-либо другие проблемы?

Существуют декодеры строк запроса.Есть много связанных тем, особенно на этом сайте.

Некоторые из них.

Первый

Второй

И javaдокументы связь для декодера Apache.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top