Регулярное выражение в перезаписи URL для соответствия значениям параметра строки запроса в любом порядке? - PullRequest
3 голосов
/ 28 апреля 2010

Многие утилиты перезаписи URL позволяют сопоставлять Regex. Мне нужно, чтобы некоторые URL сравнивались с парой основных значений параметров строки запроса, независимо от того, в каком порядке они отображаются. Например, давайте рассмотрим URL с двумя ключевыми параметрами ID = и Lang = в произвольном порядке, и, возможно, некоторые неключевые параметры перемежаются.

Пример URL-адреса для сопоставления с ключевыми параметрами в любом порядке:

Может быть, с некоторыми разбросанными неключевыми параметрами:

Существует ли хороший шаблон регулярных выражений, который можно сопоставить со значением параметра строки запроса в любом порядке, или лучше дублировать некоторые правила, или в целом следует искать другие способы?

Примечание : Основные значения строки запроса также будут записаны с использованием скобок, т. Е. ID = (3) и Lang = (500), и подставлены в целевой URL, но это не является предметом вопроса.

Ответы [ 4 ]

1 голос
/ 28 апреля 2010

Я бы предложил проанализировать строку запроса в словаре и работать оттуда, но если вы хотите регулярное выражение, вы можете использовать чередование + повторение для сопоставления в любом порядке (без встраивания всех возможных последовательностей). Пример Python:

>>> import re
>>> p = re.compile(r'(?:[?&](?:abc=([^&]*)|xyz=([^&]*)|[^&]*))+$')
>>> p.findall('x?abc=1&jjj=2&xyz=3')
[('1', '3')]
>>> p.findall('x?abc=1&xyz=3&jjj=2')
[('1', '3')]
>>> p.findall('x?xyz=3&abc=1&jjj=2')
[('1', '3')]
0 голосов
/ 28 апреля 2010

Если базовая реализация регулярного выражения понимает обе именованные группы и упреждающие просмотры нулевой ширины , вы можете заставить что-то работать, используя что-то вроде aspx\?(?=ID=(?<ID>\d+))(?=Lang=(?<Lang>\d+)) (этонепроверенные предположения), но результат, скорее всего, будет и не поддерживаемым, и, вероятно, будет недостаточно эффективным даже для наивной реализации, которая использует несколько регулярных выражений для анализа строки.

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

0 голосов
/ 28 апреля 2010

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

Кроме того, регулярные выражения не будут выполнять тот разбор, который вам необходим для обработки всех возможных входных параметров. Например:

http://www.example.com/SurveyController.aspx?ID=500&L%61ng=4

обычно является допустимым синонимом, а

http://www.example.com/SurveyController.aspx?Hello=3&ID=400&Lang=4&ID=500

часто может быть синонимом для идентификатора 400 или 500 в зависимости от синтаксического анализатора. Простые совпадения с регулярным выражением могут быть в порядке, если вы хотите только 301 загрузить устаревший адрес старого формата на новый блестящий, но этого недостаточно, чтобы они могли перехватить все возможные входные данные.

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

0 голосов
/ 28 апреля 2010

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

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

  • для совпадения (a,b) вам потребуется a,b|b,a
  • для соответствия (a,b,c) вам потребуется a,b,c|a,c,b|b,a,c|b,c,a|c,a,b|c,b,a
  • и т. Д.

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

...