什么是用于断开变量可能包含“&”的查询字符串的正则表达式

What's a regular expression to break a query string where variables may contain '&'?

本文关键字:amp 查询 正则表达式 字符串 断开 用于 变量 包含 什么      更新时间:2023-09-26

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

我目前正在使用以下代码 - 但如果任何变量包含 & 嵌入,它将不会捕获该变量的其余部分。如何缓解这种情况?

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

简单的问题:你期望从中得到什么变量?

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"}

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

另外,我会查看这个答案以获取处理参数的完整函数:如何在 JavaScript 中获取查询字符串值?