Регулярное выражение для сопоставления нескольких пар параметр/значение строки запроса
-
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 может вызвать это, но я не вижу простого пути решения этой проблемы и не слишком беспокоюсь по этому поводу..
Может ли кто-нибудь придумать лучший способ подойти к этому или увидеть какие-либо другие проблемы?