JavaScript正则表达式从查询中删除变量

时间:2015-09-08 09:28:14

标签: javascript regex

我正在尝试从查询字符串中删除变量。这是我目前的做法:

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>

2 个答案:

答案 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;
&#13;
&#13;

让我解释一下:

  • ([?&])name=.*?($|&)正则表达式包含2个捕获组([?&])(匹配?&)和($|&)(匹配字符串的结尾或& })。
  • replace方法中,我们可以将这些组的内容传递给回调函数,我们可以进一步分析如何处理替换。
  • function(m, grp1, grp2, offset, input)实际上使用了整个匹配mgrp1grp2是捕获的文本。 offset(原始字符串中的匹配索引)和input(整个输入字符串)在这里不使用,但有一天它们可能会变得有用。
  • 在回调中,我正在检查组1是否等于&#34;?&#34;。如果是,则参数位于查询字符串的开头,我们需要恢复前面的?
  • 如果没有,我们需要检查第二组的内容。如果它等于&,则匹配位于查询字符串的中间,我们需要添加&。如果没有,我们最后,不添加任何内容,我们删除整个匹配。

请参阅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;
}