什么是正则表达式来打破变量可能包含'&'的查询字符串?

时间:2012-07-03 06:25:15

标签: javascript regex web

如何编写JavaScript正则表达式以将URI分隔为查询字符串变量,其中变量本身可能包含“&”字符?

我目前正在使用以下代码 - 但是如果任何变量包含&嵌入它不会捕获该变量的其余部分。怎么能减轻这种情况呢?

function uriParameters() {
  var vars = {};
  var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
    vars[key] = value;
  });
  return vars;
}

2 个答案:

答案 0 :(得分:2)

简单的问题:您对此有何期待?

a=b&c&d=e
是吗?

a=b&c, d=e     //or 
a=b  , c , d=e

因此存在歧义,您的问题无法解决,如果您没有名称

更新:如果查询字符串仅包含name=value个对,并且没有单个name参数,那么您可以通过以下脚本提取这些对:

 function getUriParameters( uri ){
     //Some sequence of chars that can't be matched in query string
     var SYN = ",,,";
     var vars = {};
     uri.split("=")
        .map(function(value){    //Replacing last '&' by SYN value
            return value.replace(/&([^&]*)$/,SYN+'$1');
        })
        .join("=")               //Restoring uri
        .split(SYN)              //
        .forEach(function(v){    //Storing 'key=value' pairs
             vars[v.split('=')[0]] = v.split('=')[1];
             //       key                 value
        });
     return vars;
 }
 //Usage-> getUriParameters("a=b&c&d=e")
 //Sample
 console.log( JSON.stringify(getUriParameters("a=b&c&d=e")) );
 //output -> {"a":"b&c","d":"e"}

答案 1 :(得分:1)

&是一个特殊字符,其目的是将url分解为多个变量。如果是值,则对其进行编码。

此外,我还要查看此答案以获取处理参数的完整函数:How can I get query string values in JavaScript?