Логика в регулярном выражении - PullRequest
2 голосов
/ 15 апреля 2009

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

Входящая ссылка: /reservations/inn_details.asp?num=717

Перенаправленная ссылка: /reservations/property-detail.aspx?pid=00717

Как видите, исходное значение строки запроса 717 должно быть 00717 в перенаправленной ссылке. Правило состоит в том, что все идентификаторы должны быть длиной пять символов в перенаправленном URL-адресе.

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

Я мог бы сделать четыре отдельных регулярных выражения, чтобы покрыть случаи, когда значение имеет длину 1, 2, 3 или 4 цифры, но было бы намного круче, если бы все обрабатывалось одним махом!

Спасибо, B.

Ответы [ 5 ]

6 голосов
/ 15 апреля 2009

К сожалению, вы не сможете справиться с этим одним регулярным выражением. Мне кажется, что самым простым решением было бы изменение property-detail.aspx для заполнения нулями.

Что я имею в виду, просто перенаправьте регулярное выражение на "/reservations/property-detail.aspx?pid=717" и попросите файл aspx добавить необходимые нули перед pid, прежде чем он уйдет, чтобы получить данные. В любом случае должен быть какой-то код для очистки этого ввода (или, по крайней мере, я на это надеюсь), так что его можно легко добавить в этот раздел.

2 голосов
/ 15 апреля 2009

Если вы хотите использовать mod_rewrite, есть способ сделать это:

RewriteCond %{QUERY_STRING} ^(([^&]*&)*)num=(\d+)(.*)
RewriteCond 0000%3 ^0+(\d{5})$
RewriteRule ^/reservations/inn_details\.asp$ /reservations/property-detail.aspx?pid=%1 [L,R=301]
0 голосов
/ 15 апреля 2009

[?&]num=(\d+) получит значение для вас. Но регулярные выражения не реализуют логику, а только распознавание образов. Ваш язык или набор инструментов должны обеспечивать способ его анализа и работы с ним.

Например, в Perl вы можете:

s/([?&])num=(\d+)/sprintf( "%spid=%5.5d", $1, $2 )/e;

Но это, конечно, только одна из ваших проблем трансформации.

0 голосов
/ 15 апреля 2009

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

0 голосов
/ 15 апреля 2009

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

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