2017-02-06 15 views
0

URIクエリ文字列を検証するための正しい正規表現を探しています。私はいくつかの答えhereまたはhereを見つけましたが、キーや値が空である可能性があるエッジの場合にはまだ疑問があります。たとえば、次のものが有効なクエリ文字列として扱われるべきですか?クエリ文字列縮退ケース

?&& 
?= 
?a= 
?a=& 
?=a 
?&=a 

答えて

1

私が探しています[...] [有効] URIのクエリ文字列の正しい正規表現のために。

確かに、問題なし。 RFC 3986, appendix Bあたりとして、ここにある:あなたがより精巧な何かをしたい場合は、パーセントエンコードされたエンティティに加えて、使用できる文字についてsection 3.4を確認することができます

^([^#]*)$ 

。正規表現は次のようになります。

^(%[[:xdigit:]]{2}|[[:print:]])*$ 

RFC 3986に関する限り、すべての例はこれまでのところ有効です。 RFCは、クエリ文字列がどのようにして符号化であるかを示していますが、クエリ文字列はどのようにして構造化であるかについてはほとんど言及していません。以前のRFCは、文法を正式に指定することなく、CGIとHTTPの間のクエリ文字列の構造に対する権限を継続的にシフトしています(RFC 3875, sec. 4.1.7RFC 2396, sec. 3.4RFC 1808, sec. 2.1、…を参照)。

興味深いノートはRFC 7230, section 2.4で見つけることができます。これは、クエリの特定の形式をサポートしていない環境の運用の困難を引き起こす可能性がありますよう

アプリケーションが直接、クエリの構文を指定してはなりません。 […] HTMLは、フォームの送信に使用されるクエリ文字列の構文を制限します。新しいフォームの言語がそれをエミュレートするが、その代わりに、このようなクエリ文字列の完全な妥当性チェックのURI

の広い多様の作成を許可しません、あなたは、W3Cが推奨する​​を実装する必要があります。正規表現で行うことができますが、私は正気の理由からそれに対して助言します。

あなたの例に関して:私はそれらがすべて有効であると信じています。それらをどのように解釈するのかは、受信側のアプリケーションに任せておかなければなりません。しかし、あなたが考えるかもしれないほどのフリンジケースではないものもあります。?&&は単に空の辞書ですが、?=a{ "": "a" }にマップできます。

+0

有望な将来の標準[here](https://url.spec.whatwg.org/#application/x-www-form-urlencoded)... –