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

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

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

abc = 123 def = 456 и ghi = 789 - все известные фиксированные строки. Они могут появляться в любом порядке в строке запроса и могут быть или не быть единственными параметрами, могут быть или не быть смежными. Он должен быть умным и не соответствовать aabc = 123 или abc = 123 4 (поэтому каждый искомый параметр должен заключаться в скобки с &,?, # Или концом строки). Вывод, который я хочу, - это новая строка запроса с оставшимися параметрами.

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

Ответы [ 4 ]

1 голос
/ 22 мая 2009

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

0 голосов
/ 25 ноября 2011

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

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

First

Второй

И javadocs ссылка для apache декодера.

0 голосов
/ 23 мая 2009

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

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 (? <= и (? =), по-видимому, являются ключом к тому, чтобы я мог искать охватывающее & или?, не «поглощая его», чтобы испортить следующее совпадение. </p>

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

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

0 голосов
/ 22 мая 2009
s/(\?|\#|\&)(abc=123|def=456|ghi=789)(\&|\#|$)//g

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

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