2009-04-15 11 views
2

私は、古いサイトから新しいサイトの同等のページへの着信リンクのリダイレクトを処理するための正規表現をまとめています。正規表現の論理

着信リンク: /reservations/inn_details.asp?num=717

私はバックエンドでそれを行う必要はありませんので、私は正規表現で次のような状況に対処することができます願っていますリダイレクトされたリンク: /reservations/property-detail.aspx?pid=00717

ご覧のとおり、元のクエリ文字列の値717は、リダイレクトされたリンクで00717にする必要があります。ルールでは、これらのIDはすべてリダイレクトされたURLで5文字の長さにする必要があります。

私の質問は、正規表現内でクエリ文字列の値の文字数を把握し、先頭に0を付けて5文字にすることですか?

私は値が1,2,3または4桁の場合をカバーするために4つの別々の正規表現を使うことができましたが、それはすべてを1つにまとめて扱うほうがはるかにクールです!

おかげで、 B.

答えて

6

は、残念ながら、これはあなただけでは正規表現で処理することができますものではありません。最も簡単な修正は、zero-paddingを行うためにproperty-detail.aspxを変更することです。

正規表現を「/reservations/property-detail.aspx?pid=717」にリダイレクトして、aspxファイルにpidの前に必要な0を追加してフェッチするデータ。とにかく(少なくとも私はそうしたいと思う)その入力をサニタイズするコードがなければならないので、そのセクションに簡単に追加することができます。

+0

ええ、私はあなたが正しいと思う - 私はちょうどそのコードの中でそれを行うのに最適な場所です。ありがとう! –

0

ランダム正規表現の実装には何があるのか​​は分かりませんが、少なくとも実際の正規表現はありません。

0

あなたは正規表現をどのような汎用言語から呼んでいるのか説明していません。しかし、ほとんどの言語は、正規表現を使用してテキストを照合し置き換える機能を提供します。文字列の数値部分を一致させてから、あなたの言語の機能を使用して数字を先行ゼロで埋めてください。

2

あなたは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

+1新しい正規表現エンジンの使用! – Codebrain

0

[?&]num=(\d+)はあなたのための値を取得します。しかし、正規表現は論理を実装せず、パターン認識のみを実装します。あなたの言語やツールセットは、分析や対処方法を提供する必要があります。 Perlで例えば

、あなたは可能性があります

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

しかし、もちろんそれはただ一つだけ、あなたの変換の問題に対処しています。