【问题标题】:jquery query parameter parsing - "=" in query string breaks query string upjquery查询参数解析-查询字符串中的“=”将查询字符串分解
【发布时间】:2011-08-29 20:54:54
【问题描述】:

我正在尝试使用this jquery plugin 和此示例查询字符串从查询字符串中解析参数:

http://test.com/?xnJTqqWEclJnnPEvWH&cid=3DF3-00-=63-D4-DA-2F-91-6B-39-39-75-E4-C1-B7-28-12&mid=3D93-36-14-46-4D-52-9E-48-17-=6A-50-13-56-FA-0A-06&PROMO_MONTH=3D201106

使用插件的代码:

console.log($.getQueryParam( "cid" ));

cid 在“=”符号的第一个实例处被划分 - 所以而不是:

3DF3-00-=63-D4-DA-2F-91-6B-39-39-75-E4-C1-B7-28-12

我明白了

3DF3-00-

这是正常行为吗?等号在这个查询字符串中是否有特别的作用?如果没有,我如何解析这个查询字符串以便得到整个参数?

【问题讨论】:

  • 是的,等号是特殊的,因为它将参数名称与值分开。但是,更好的解析器可能会检测到两个“连续”=(两者之间没有&)。不过,afaik,如果你想在一个值中使用它,它必须被编码。
  • 我无法更改查询字符串中传递的值。我只能操纵从 URL 收到的内容。
  • 您无法更改或编码查询字符串?是否可以保证它始终是最后一个参数? (我在想你可能必须对它进行字符串解析,而不是使用 jQuery 函数)。

标签: javascript jquery parsing parameters query-string


【解决方案1】:

请改用gup。我看到它在很多地方都使用过,而且效果很好。这很简单。请注意,我在 url 中对 fiddle 进行了小改动。下面的代码是你应该实际使用的。

http://jsfiddle.net/mrtsherman/trqJ8/

gup('cid');

function gup( name )
{
 name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
 var regexS = "[\\?&]"+name+"=([^&#]*)";
 var regex = new RegExp( regexS );
 var results = regex.exec( window.location.href );
 if( results == null )
    return "";
 else
    return results[1];
}

【讨论】:

  • 不错!而且不需要插件!
  • 请注意,这不支持数组等。它也应该有:return decodeURIComponent(results[1]); 没有简单的方法可以做到这一点。我决定使用jquery.query.js
【解决方案2】:

插件本身并不是为了容纳这样的字符串而编写的。罪魁祸首是下面这段代码……

if (params[0] == param) {
 return params[1] || '';
}

在此步骤之前不久,插件脚本在等号上执行split() 创建一个数组。上面的代码 sn-p 应该改成下面这样,才能让你的查询检索工作……

if (params[0] == param) {
    var paramOut = '';
    for (var p = 1; p < params.length; p++) {
        paramOut += params[p] + '=';
    }
    return paramOut.substr(0, paramOut.length - 1); // to remove the trailing equal sign
} else {
    return '';
}

如果你仍然有兴趣使用它,这是我修改过的插件...

(function($){$.getQueryParam=function(param){var pairs=location.search.substring(1).split('&');for(var i=0;i<pairs.length;i++){var params=pairs[i].split('=');if(params[0]==param){var paramOut='';for(var p=1;p<params.length;p++){paramOut+=params[p]+'=';}return paramOut.substr(0, paramOut.length-1);}else{return '';}}return undefined;};})(jQuery);

【讨论】:

  • +1 用于治疗病症而不是症状。你应该通知插件作者!
【解决方案3】:

是的。 “=”用作查询部分的分隔符,因此您应该对其进行转义。 Yandex 搜索引擎这样做: http://yandex.ru/yandsearch?text=%3D

【讨论】:

    猜你喜欢
    • 2019-05-03
    • 2011-02-27
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 2011-07-20
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多