查询字符串退化情况

Query string degenerate cases

我正在四处寻找用于验证 URI 查询字符串的正确正则表达式。我找到了一些答案 here or here 但我仍然对边缘情况有疑问,在这些情况下,键或值可能为空。例如,是否应将以下内容视为有效查询字符串?

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

I am looking [...] for a correct regular expression for [valid] URI query strings.

没问题,没问题。根据 RFC 3986, appendix B,这里是:

^([^#]*)$

如果您想要更详细的内容,除了 percent-encoded 实体之外,您还可以检查 section 3.4 允许的字符。正则表达式看起来像这样:

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

就 RFC 3986 而言,您的所有示例目前都是有效的。 RFC 告诉我们查询字符串必须如何 编码 ,而很少说明查询字符串必须如何 结构化 。较旧的 RFC 不断地在 CGI 和 HTTP 之间转移对查询字符串结构的权威,而从未正式指定语法(参见 RFC 3875, sec. 4.1.7, RFC 2396, sec. 3.4, RFC 1808, sec. 2.1、…)。

可以在 RFC 7230, section 2.4 中找到一个有趣的注释:

Applications MUST NOT directly specify the syntax of queries, as this can cause operational difficulties for deployments that do not support a particular form of a query. […] HTML constrains the syntax of query strings used in form submission. New form languages SHOULD NOT emulate it, but instead allow creation of a broader variety of URIs

要对此类查询字符串进行全面的有效性检查,您必须实施 W3C 推荐的 algorithm for decoding formdata。可以在正则表达式中完成,但出于理智的原因我建议不要这样做。

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