我正在尝试从查询字符串中删除变量。这是我目前的做法:
var str = "http://example.com/tal.php?sec=16&name=xxxx&size=xxxx";
str = str.replace(/([&])name=.*?(&|$)/g,"");
此代码存在两个问题:
名称开头和结尾的&
都会被删除。我只想删除一个
当变量名称位于查询字符串的开头或末尾时,它也应该有效。
如果第二个&
与第一个Error: Can't set headers after they are sent.
匹配,我怎么能告诉正则表达式?{/ p>
答案 0 :(得分:2)
我建议使用捕获组,然后在回调函数中使用它们来适当地重新插入&
字符:
([?&])name=.*?($|&)
请参阅demo
这是一个JavaScript代码段,显示了所有3个位置的替换过程:
function removeQueryArg(str) {
var re = /([?&])name=.*?($|&)/;
return str.replace(re, function(m, grp1, grp2, offset, input) {
return grp1 === "?" ? "?" : (grp2 === "&" ? "&" : "");
});
}
document.write(removeQueryArg('http://example.com/tal.php?name=xxxx&sec=16&size=xxxx') + "<br/>" +
removeQueryArg('http://example.com/tal.php?sec=16&name=xxxx&size=xxxx') + "<br/>" +
removeQueryArg('http://example.com/tal.php?sec=16&size=xxxx&name=xxxx'));
&#13;
让我解释一下:
([?&])name=.*?($|&)
正则表达式包含2个捕获组([?&])
(匹配?
或&
)和($|&)
(匹配字符串的结尾或&
})。replace
方法中,我们可以将这些组的内容传递给回调函数,我们可以进一步分析如何处理替换。function(m, grp1, grp2, offset, input)
实际上使用了整个匹配m
,grp1
和grp2
是捕获的文本。 offset
(原始字符串中的匹配索引)和input
(整个输入字符串)在这里不使用,但有一天它们可能会变得有用。?
。 &
,则匹配位于查询字符串的中间,我们需要添加&
。如果没有,我们最后,不添加任何内容,我们删除整个匹配。请参阅Specifying a function as a parameter at MDN replace
method help page。
答案 1 :(得分:1)
解决此问题的一种简单方法是删除name
参数以及前面的问号或&符号。如果问号被删除,请通过用问号替换第一个&符号将其重新插入。
s = s.replace(/([?&]name=[^&]*)/, '');
if (s.indexOf('?') == -1) {
s = s.replace(/[&]/, '?');
}
演示:
function print(s) {
document.write(s + '<br \>');
}
function deleteName(s) {
print(s);
s = s.replace(/([?&]name=[^&]*)/, '');
if (s.indexOf('?') == -1) {
s = s.replace(/[&]/, '?');
}
print(s);
print('');
}
deleteName('http://example.com/tal.php?name=xxxx&sec=16&size=xxxx');
deleteName('http://example.com/tal.php?sec=16&name=xxxx&size=xxxx');
deleteName('http://example.com/tal.php?sec=16&size=xxxx&name=xxxx');
body {
font-family: sans-serif;
}