2015-09-08 113 views
0

我试图从查询字符串中删除一个变量。这是我目前的做法:JavaScript正则表达式从查询中删除变量

var str = "http://example.com/tal.php?sec=16&name=xxxx&size=xxxx"; 
str = str.replace(/([&])name=.*?(&|$)/g,""); 

有两个问题与此代码:

  • 无论是在&名称的开头和结尾移除。我只想要删除一个

  • 当变量名称位于查询字符串的开头或结尾时,它也应该起作用。

如何才能告诉正则表达式删除第二个&只有当它匹配第一个?

回答

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'));

让我解释:

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

查看更多在Specifying a function as a parameter at MDN replace method help page

+0

我做了一个修正,因为我真的不希望以匹配第一个,这种变化之后,如果你把变量 “?”作为查询字符串的第一个,它不匹配... – Vandervals

+0

没错,所有这些都可以通过在回调函数中捕获组和逻辑来解决。请检查更新后的答案。 –

+0

看起来不错你不知道你给替换的功能在做什么... – Vandervals

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

+0

是的,基本上,这是一个类似的解决方案,但使用2个正则表达式替换,而不是一个。 –

+0

'
'是一个有效的标签。 –