2013-02-11 132 views
3

当我有一个网址是这样的:约定的查询字符串参数

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

我明白,在我的JavaScript的姓名查询应该返回“杰克”。

但是应该怎样查询在下列情况下姓回报:

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

取决于您如何创建该功能。 – Dom 2013-02-11 18:06:59

+0

获取查询字符串数据,同时您可以忽略无效的查询字符串参数,并显示结果集的有效参数 – 2013-02-11 18:07:16

+0

@Dom,这就是为什么我查询通常的约定 – Christophe 2013-02-11 18:08:09

回答

0

但是应该怎样查询返回

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

但是,你问约定:

http://server/site?lastname=Daniels

结果应该是falsy表示没有firstName。您可以选择nullundefined

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

这往往代表了一些布尔参数,所以返回true将是合法的。但我确定有些库完全忽略了这种格式。

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

这是相当明显的空字符串""

+0

Thx!我没有想到为第二种情况返回正确。你有参考证明它是标准的吗? – Christophe 2013-02-11 18:35:40

+0

由于这些功能都没有标准化,所以几乎没有参考。当然你可以看看流行的js库中的URL解析函数的文档。 – Bergi 2013-02-11 18:40:40

+0

好点。任何推荐(AFAIK jQuery没有) – Christophe 2013-02-11 18:42:09

1

但应在下列情况下名字返回查询的内容:

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先后为firstname键的undefined值。
  • ?firstname&lastname=Daniels对于firstname密钥具有值null
  • ?firstname=&lastname=Daniels对于firstname密钥的值为''

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

这通常与obj.hasOwnProperty('key')做,但是作为对象真的是越来越散,Object.prototype.hasOwnProperty.call(obj, 'key') is preferrable,这可能是抽象成一个has功能:如果您使用underscore.js

has(obj, key) { 
    return Object.prototype.hasOwnProperty.call(obj, key); 
} 

,那么你可以使用_.has(obj, key)

+0

这非常有意义。事实上,我正在使用一个对象来存储参数。与@ Bergi的答案不同的是第二种情况。 – Christophe 2013-02-11 19:36:17

+1

@Christophe,Bergi对使用布尔键做了一个很好的说明,但是如果你使用查询字符串的对象表示,你应该使用'obj.hasOwnProperty('key')'来检查键是否存在在对象中。其实,即使这是错误的,[你应该*真正*使用像'has(obj,'key')'](http://www.devthought.com/2012/01/18/an-object-is-不-A-散列/)。 – zzzzBov 2013-02-11 19:43:39