我正在寻找一个正确的regualr表达式来验证URI查询字符串。我找到了一些答案here或here,但我仍然对边缘情况有疑问,其中键或值可能为空。例如,应将以下内容视为有效查询字符串吗?
?&&
?=
?a=
?a=&
?=a
?&=a
答案 0 :(得分:1)
我正在寻找[有效] URI查询字符串的正确正则表达式。
当然,没有问题。根据{{3}},这里是:
^([^#]*)$
如果您想要更精细的内容,除了百分比编码实体外,还可以检查RFC 3986, appendix B允许的字符。正则表达式看起来像这样:
^(%[[:xdigit:]]{2}|[[:print:]])*$
就RFC 3986而言,到目前为止,您的所有示例都是有效的。 RFC告诉我们查询字符串必须如何编码,而几乎没有说明查询字符串必须是结构化。较旧的RFC不断地在CGI和HTTP之间转换查询字符串结构的权限,而无需正式指定语法(参见例如section 3.4,RFC 3875, sec. 4.1.7,RFC 2396, sec. 3.4,...)。
可以在RFC 1808, sec. 2.1中找到一个有趣的注释:
应用程序不能直接指定查询的语法,因为这会导致不支持特定形式的查询的部署的操作困难。 [...] RFC 7230, section 2.4约束表单提交中使用的查询字符串的语法。新的表单语言不应该模仿它,而是允许创建更多种类的URI
要对此类查询字符串进行完整有效性检查,您必须实施W3C推荐的HTML。可以在正则表达式中完成,但出于理智的原因,我会建议反对它。
关于你的例子:我相信它们都是有效的。如何解释它们应留给接收应用程序。有些并不像你想象的那么多:?&&
只是一个空字典而?=a
可以映射到{ "": "a" }
。