查询字符串退化情况

时间:2017-02-06 13:28:53

标签: regex http url query-string querystringparameter

我正在寻找一个正确的regualr表达式来验证URI查询字符串。我找到了一些答案herehere,但我仍然对边缘情况有疑问,其中键或值可能为空。例如,应将以下内容视为有效查询字符串吗?

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

1 个答案:

答案 0 :(得分:1)

  

我正在寻找[有效] URI查询字符串的正确正则表达式。

当然,没有问题。根据{{​​3}},这里是:

^([^#]*)$

如果您想要更精细的内容,除了百分比编码实体外,还可以检查RFC 3986, appendix B允许的字符。正则表达式看起来像这样:

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

就RFC 3986而言,到目前为止,您的所有示例都是有效的。 RFC告诉我们查询字符串必须如何编码,而几乎没有说明查询字符串必须是结构化。较旧的RFC不断地在CGI和HTTP之间转换查询字符串结构的权限,而无需正式指定语法(参见例如section 3.4RFC 3875, sec. 4.1.7RFC 2396, sec. 3.4,...)。

可以在RFC 1808, sec. 2.1中找到一个有趣的注释:

  

应用程序不能直接指定查询的语法,因为这会导致不支持特定形式的查询的部署的操作困难。   [...]   RFC 7230, section 2.4约束表单提交中使用的查询字符串的语法。新的表单语言不应该模仿它,而是允许创建更多种类的URI

要对此类查询字符串进行完整有效性检查,您必须实施W3C推荐的HTML。可以在正则表达式中完成,但出于理智的原因,我会建议反对它。

关于你的例子:我相信它们都是有效的。如何解释它们应留给接收应用程序。有些并不像你想象的那么多:?&&只是一个空字典而?=a可以映射到{ "": "a" }