在url参数javascript中存储键值对列表.

Jon*_*lls 3 javascript url jquery url-parameters

假设www.mydomain.com?param1=example作为一个例子.

存储作为键值对列表的第二个参数的最佳方法是什么?在我使用的那一刻&param2=key|value,key|value.我使用垂直线将键与值分开,并使用逗号配对,等于之后的所有内容都使用encodeURIComponent().这很好用.

然而,用户可以控制价值......而作为明智的人类,我们都知道用户可能做的第一件事就是将垂直条或逗号作为破坏我的参数解析器的值之一.有一个更好的方法吗?我见过PHP用户正在讨论在URL中存储相关数组,但我正在寻找一个纯粹的JavaScript解决方案.

Roc*_*mat 6

PHP(和其他服务器端语言)支持在查询字符串中传递数组.

www.mydomain.com?param1=example&param2[key1]=value1&param2[key2]=value2
Run Code Online (Sandbox Code Playgroud)

PHP将解析GET字符串:

array(2) {
  ["param1"]=>
  string(7) "example"
  ["param2"]=>
  array(2) {
    ["key1"]=>
    string(6) "value1"
    ["key2"]=>
    string(6) "value2"
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你没有传递密钥,它将成为一个数字数组:

www.mydomain.com?param1=example&param2[]=value1&param2[]=value2
Run Code Online (Sandbox Code Playgroud)

将被解析为:

array(2) {
  ["param1"]=>
  string(7) "example"
  ["param2"]=>
  array(2) {
    [0]=>
    string(6) "value1"
    [1]=>
    string(6) "value2"
  }
}
Run Code Online (Sandbox Code Playgroud)

更新:您还可以在JavaScript中解析查询字符串.

这是我制作的一个简单的jQuery插件:

$.parseQuery = function(str) {
    var ret = {};
    $.each(str.split("&"), function() {
        var data = this.split('='),
            name = decodeURIComponent(data.shift()),
            val = decodeURIComponent(data.join("=")).replace('+', ' '),
            nameVal = name.match(/(.*)\[(.*)\]/);

        if (nameVal === null) {
            ret[name] = val;
        }
        else {
            name = nameVal[1];
            nameVal = nameVal[2];
            if (!ret[name]) {
                ret[name] = nameVal ? {} : [];
            }
            if ($.isPlainObject(ret[name])) {
                ret[name][nameVal] = val;
            }
            else if($.isArray(ret[name])){
                ret[name].push(val);
            }
        }
    });
    return ret;
};
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:$.parseQuery('param1=example&param2[]=value1&param2[]=value2');.