Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查询字符串参数的约定_Javascript_Html_Url_Query String - Fatal编程技术网

Javascript 查询字符串参数的约定

Javascript 查询字符串参数的约定,javascript,html,url,query-string,Javascript,Html,Url,Query String,当我有这样一个url时: 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?firstn

当我有这样一个url时:

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
http://server/site?lastname=Daniels
http://server/site?firstname&lastname=Daniels
http://server/site?firstname=&lastname=Daniels
[编辑]回答一些评论:以上所有都是合法的查询字符串,我的问题不是如何检索参数,而是如何解释参数

作为记录,我使用以下涵盖所有情况的正则表达式解析QueryString:

/([^?=&;]+)(?:=([^&;]*))?/g
显然有,但答案是错误的(或者至少没有解决边缘问题)

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

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
但是查询应该返回什么呢

这是你的决定,你需要什么?有几种不同复杂度的查询字符串求值函数。其中一些可以处理重复的、嵌套的、括号语法值,另一些则不能。著名的问题可以在和它的重复问题中找到

但是,您要求约定:

http://server/site?lastname=Daniels

结果应该是虚假的,以表示缺少
firstName
。您可以选择
null
undefined

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

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

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

这显然是空字符串

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

http://server/site?lastname=Daniels
http://server/site?firstname&lastname=Daniels
http://server/site?firstname=&lastname=Daniels
http://server/site?lastname=Daniels
http://server/site?firstname&lastname=Daniels
http://server/site?firstname=&lastname=Daniels
查询字符串可以很容易地用JavaScript中的对象表示法表示。只需设置对象上查询字符串中存在的键

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

{
    lastname: 'Daniels'
}
{
    firstname: null,
    lastname: 'Daniels'
}
{
    firstname: '',
    lastname: 'Daniels'
}
{
    foo: [
        'bar',
        'baz'
    ]
}
如果存在键,但没有给出值(没有等号),则应使用表示“无值”的
null
值设置键

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

{
    lastname: 'Daniels'
}
{
    firstname: null,
    lastname: 'Daniels'
}
{
    firstname: '',
    lastname: 'Daniels'
}
{
    foo: [
        'bar',
        'baz'
    ]
}
在存在键且提供的值为空(等号)的情况下,该值实际上是空字符串

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

{
    lastname: 'Daniels'
}
{
    firstname: null,
    lastname: 'Daniels'
}
{
    firstname: '',
    lastname: 'Daniels'
}
{
    foo: [
        'bar',
        'baz'
    ]
}
还有一个经常被忽略的情况,即同一个键被多次使用。在传统的查询字符串语法(不是PHP)中,可以多次使用键来表示数组

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

{
    lastname: 'Daniels'
}
{
    firstname: null,
    lastname: 'Daniels'
}
{
    firstname: '',
    lastname: 'Daniels'
}
{
    foo: [
        'bar',
        'baz'
    ]
}
,可抽象为
具有
功能:

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

如果正在使用,则可以使用

获取查询字符串数据,同时可以忽略无效的查询字符串参数并使用有效参数显示结果集。我始终使用以下函数:Thx!对于第二个案例,我没有考虑返回true。你会有一个标准的参考资料吗?因为这些功能都没有标准化,所以很难有参考资料。当然,您可能会看到流行js库中URL解析函数的文档。将此文档标记为answer,我非常喜欢在案例2中将参数设置为true的想法。然而,正如我在更新的帖子中所说的,引用看起来不正确。@Christophe,Bergi对布尔键的使用提出了很好的观点,但是如果您使用的是查询字符串的对象表示形式,则应该使用
obj.hasOwnProperty('key')
来检查对象中是否存在该键。事实上,即使这样也是错误的。