複数のクエリ文字列パラメータ/値のペアを一致させる正規表現

StackOverflow https://stackoverflow.com/questions/895279

  •  23-08-2019
  •  | 
  •  

質問

この1を介して動作するのに約ますが、

誰かがすでにそれに取り組むために持っていたかもしれないと思ったので...

私はこれらの3つを除去しながら、順番に関係なく、クエリ文字列に3つの既知のパラメータ/値のペアを探し、また、他のすべてのパラメータを抽出するために正規表現を(互換性の書き換えやISAPI)エレガントを探しています。

ABC = 123 のDEF = 456 GHI = 789 のすべての既知の、固定された文字列です。彼らは、または隣接してもしなくてもよい、クエリ文字列内の任意の順序で表示され、そしてよく、またはパラメータのみであってもなくてもよいです。それはスマートであると一致しないはずの AABC = 123 または ABC = 123 の4(その結果、各パラメータは、囲ま&べきか検索し、文字列の#、または終了) 。私が欲しいの出力は取り除か残りのparamsを使用して新しいクエリ文字列です。

私はおそらく朝のロジックで刺しを取ることになりますので、私はそれからにしようとする前にボーナスポイントは、あなたがそれを解決することができます。

正しい解決策はありません

他のヒント

私は、正規表現は、この種の問題のために使用すべきではないと思います。単なる文字列をトークン化し、あなたが探しているものに、すべてのパラメータの名前を比較します。

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]

これは私が作品だと思います。先読み/後読み修飾子、(?<=とは(?=、私は混乱に次の試合をアップ「それを消費する」ことなく、包括&または?を探しできるようにするための鍵であるように見える。

一つの落とし穴は、古いページのURLのみ3つのparamsを持っている場合、私はまだ、末尾で終わるということですか?リダイレクトされたURLにパラメータを指定せず、「/newpage.htm?」。

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に#additionsのためである...私は本当にそれが必要なのでしょうか?)他の問題は、私が/oldpage.htm?abc=123&abc=123&abc=123のURLがこれをトリガーするとしていますが、私はその周りに任意の簡単な方法を見ていないし、それについてあまり心配していないよん..

誰もがこれをアプローチするより良い方法を考える、または任意の他の問題を見ることはできますか?

クエリ文字列デコーダがあります。多くの接続のトピックは、特に、このサイト上で、あります。

そのうちのいくつかを。

まず

セカンド

とのjavadoc <のhref = "http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/utils/URLEncodedUtils.html#parse%28org.apache。 http.HttpEntity%29" REL = "nofollowをnoreferrer"> Apacheのデコーダのリンクの

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top