我有以下代码,因此我可以从网址中获取参数。
但是其中一个参数在文本中带有&
符号,导致文本被截断。如何使&符号与相应的文本一起显示?
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健康与健身
答案 0 :(得分:2)
&
是一个特殊字符-您必须对其进行URL编码。使用encodeURIComponent
自动执行此操作:
const str = "Club Plus Health & Fitness";
const encoded = encodeURIComponent(str);
console.log(encoded);
答案 1 :(得分:2)
%26
而不是无效的&
。生成URL的人都需要在服务器端进行修复。
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+个字符,并且尽可能少(?=&[^=&]+=|$)
-后跟&
,=
和&
以外的一个或多个字符,然后是=
,或字符串的结尾。