查询字符串参数的约定

时间:2013-02-11 18:03:47

标签: javascript html url query-string

当我有这样的网址时:

http://server/site?firstname=Jack&lastname=Daniels

据我所知,在我的JavaScript中,firstname的查询应返回“Jack”。

但是在下列情况下,firstname的查询应该返回什么:

http://server/site?lastname=Daniels
http://server/site?firstname&lastname=Daniels
http://server/site?firstname=&lastname=Daniels

[编辑]回答一些评论:以上所有都是合法的查询字符串,我的问题不是如何检索参数,而是如何解释它们。

为了记录,我使用以下涵盖所有情况的正则表达式解析查询字符串:

/([^?=&;]+)(?:=([^&;]*))?/g

显然有a very popular question on how to retrieve querystring parameters,但答案不正确(或者至少没有解决边缘情况)。

[更新]我的选择基于@Bergi和@zzzzBov的答案:

http://server/site?lastname=Daniels                => firstname: undefined
http://server/site?firstname&lastname=Daniels      => firstname: true
http://server/site?firstname=&lastname=Daniels     => firstname: ""
http://server/site?firstname=Jack&lastname=Daniels => firstname: "Jack"

副作用是我必须稍微修改我的正则表达式,因为上述规则需要捕获=符号:

/([^?=&;]+)(=[^&;]*)?/g

2 个答案:

答案 0 :(得分:1)

  

但是在下列情况下,firstname的查询应该返回什么:

http://server/site?lastname=Daniels
http://server/site?firstname&lastname=Daniels
http://server/site?firstname=&lastname=Daniels

查询字符串可以很容易地用JavaScript中的对象表示法表示。只需设置对象上查询字符串中存在的键即可。

这意味着对于?lastname=Daniels,生成的对象应为:

{
    lastname: 'Daniels'
}

如果密钥存在但没有给出值(没有等号),则密钥应设置为null,表示“无值”。

这意味着对于?firstname&lastname=Daniels,生成的对象应为:

{
    firstname: null,
    lastname: 'Daniels'
}

如果密钥存在且提供的值为空(等号),则该值实际上为空字符串。

这意味着对于?firstname=&lastname=Daniels,生成的对象应为:

{
    firstname: '',
    lastname: 'Daniels'
}

还有一个经常被忽视的情况是多次使用相同的密钥。在传统的查询字符串语法(不是PHP)中,可以按原样多次使用键来表示数组。

这意味着对于?foo=bar&foo=baz,生成的对象应为:

{
    foo: [
        'bar',
        'baz'
    ]
}

<一旁>

在PHP中,用于数组的键后缀为[]

`?foo[]=bar&foo[]=baz`

PHP将自动转换查询字符串服务器端,以便:

$_GET['foo'] = array('bar', 'baz')

< /预留>

回到最初的问题,这意味着以下几点:

  • ?lastname=Daniels的{​​{1}}密钥值为undefined
  • firstname的{​​{1}}密钥值为?firstname&lastname=Daniels
  • null的{​​{1}}密钥值为firstname

对于根据其存在使用键作为布尔值的情况,您应该检查对象是否具有键集(并且完全忽略该值,因为它无关紧要)。

通常这是使用?firstname=&lastname=Daniels完成的,但是因为对象实际上更像是一个哈希Object.prototype.hasOwnProperty.call(obj, 'key') is preferrable,它可以被抽象为''函数:

firstname

如果您使用的是underscore.js,则可以使用_.has(obj, key)

答案 1 :(得分:0)

  

但是查询应该返回什么

这是你的决定,你需要什么?有几种不同复杂度的查询字符串评估函数。其中一些可以处理重复的,嵌套的括号语法值,而另一些则不能。着名的可以在How can I get query string values in JavaScript?及其重复的问题中找到。

但是,您要求约定:

  

http://server/site?lastname=Daniels

结果应该是表示缺少firstName的虚假事物。您可以选择nullundefined

  

http://server/site?firstname&lastname=Daniels

这通常代表一些布尔参数,因此返回true将是合法的。但我确信有些库完全忽略了这种格式。

  

http://server/site?firstname=&lastname=Daniels

这显然是空字符串""