解析带有“&”字符的URL参数,后面不带“ =”

时间:2019-05-13 08:03:38

标签: javascript html regex string object

我有以下代码,因此我可以从网址中获取参数。

但是其中一个参数在文本中带有&符号,导致文本被截断。如何使&符号与相应的文本一起显示?

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

 var cmp = getUrlVars()["cmp"];
    document.getElementById("currentMemberPackage").value = cmp;
    var replaced = cmp.replace(/%20/g, " "); 

示例URL = ?Club%20Plus%20Health%20&%20Fitness(由于要推送到URL中的数据中有&,因此我无法更改它)

显示: Club Plus Health

应为: Club Plus健康与健身

3 个答案:

答案 0 :(得分:2)

URI中的

&是一个特殊字符-您必须对其进行URL编码。使用encodeURIComponent自动执行此操作:

const str = "Club Plus Health & Fitness";
const encoded = encodeURIComponent(str);
console.log(encoded);

答案 1 :(得分:2)

  1. 服务器必须发送%26而不是无效的&。生成URL的人都需要在服务器端进行修复。
  2. 然后可以用有用的URLSearchParams
  3. 替换您的函数

var url = "?cmp=Club%20Plus%20Health%20%26%20Fitness"

var cmp = new URLSearchParams(url).get("cmp");
console.log(cmp)

或者,如果您不能阻止无效&发送,则为替代方法。
确保不要盲目地将&转换为%26,否则,如果有多个参数,则可以破坏代码:

var url = "?someparm=a&cmp=Club%20Plus%20Health%20&%20Fitness"
           .replace(/&%20/g,"%26 "); // add the space!

var cmp = new URLSearchParams(url).get("cmp");
console.log(cmp)

答案 2 :(得分:2)

这是数据提供者方面的错误,请告知数据提供者,因为这应该已解决。

如果您知道所有可能的键值并且它们不是太多,则有一种方法可以正确地100%提取值。在这种情况下,正则表达式可能看起来像

new RegExp("[?&]+([^=&]+)=(.*?)(?=&(?:" + your_keys.map(function(x) {return x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');}).join("|") + ")=|$)", "gi")

有一个脆弱的通用非100%解决方法,例如

/[?&]+([^=&]+)=(.*?)(?=&[^=&]+=|$)/gi

请参见this regex demo。您可以使用它,直到数据提供者解决此问题并且您不知道所有可能的键为止。

详细信息

  • [?&]+-1个或更多?&个字符
  • ([^=&]+)-第1组:除=&之外的一个或多个字符
  • =-等号
  • (.*?)-第2组:除换行符以外的任何0+个字符,并且尽可能少
  • (?=&[^=&]+=|$)-后跟&=&以外的一个或多个字符,然后是=,或字符串的结尾。
  • li>