通过正则表达式从url中删除参数

时间:2018-05-26 08:40:43

标签: javascript regex

我有一个从url中删除参数的功能。
这是我的功能:

function removeParameter(key) {
   let parameters = document.location.search;

   const regParameter = new RegExp('[?|&]' + key + "=([a-zA-Z0-9_-]+)");

   if (regParameter.test(parameters)){
       parameters = parameters.replace(regParameter , '')
   }

    window.history.pushState({}, '', parameters)}

当我把这个函数称为这个URL的时候   http://example.com/products?color=4&brand=apple

删除品牌的第一个调用功能是正确的结果
    removeParameter('brand')
但另一个称此功能用于删除颜色不能正常工作。 实际上,当我想删除第一个参数(键在标记之后)时,这个功能不起作用......

3 个答案:

答案 0 :(得分:1)

如果我错了,请纠正我,
我从你的代码中创建了一个工作片段,它似乎正常工作。

如果您在新的新标签页上运行代码段,它会在标签页历史记录中添加2个网址 我还修改了你的正则表达式以使其更容易。



function removeParameter(key) {
  var parameters = url; // document.location.search; // TAKIT: modified for test
  const regParameter = new RegExp('[?|&]' + key + "=([^&]+)"); // TAKIT: Simplified regex
  if (regParameter.test(parameters)) {
    parameters = parameters.replace(regParameter, '')
  }
  window.history.pushState({}, 'Test 1', parameters);
  return parameters; // TAKIT: Added
}

// Output 
var url = "https://stacksnippets.net/js?color=4&brand=apple";
console.log(url);
url = removeParameter("brand");
console.log(url);
url = removeParameter("color");
console.log(url);




希望它有所帮助。

答案 1 :(得分:1)

pushState()的第三个参数是整个网址。您的函数仅发送URL的window.history.pushState({}, '', location.pathname + parameters)} 即查询参数部分。所以你需要做

?

在你的功能的最后一行。此外,您的代码目前尚未处理边缘情况,即如果删除第一个参数,则会删除&而不是尾随http://example.com/products&brand=apple。因此,您最终得到的const reg = new RegExp('[?&](' + key + '=[\\w-]+&?)'); let matches = reg.exec(parameters); if (matches){ parameters = parameters.replace(matches[1], ''); } 不是有效的网址。最后,我简化了你的表达。

split('&')

这仍然无法处理更复杂的情况(没有值的参数,散列等)。还有其他几种选择:

  1. 转储正则表达式并使用基于var params = new URLSearchParams(location.search); params.delete(key); window.history.pushState({}, '', location.pathname + "?" + params.toString()); 的解决方案。更多代码,但更具可读性且不易出错。
  2. 如果您不需要IE支持,请使用URLSearchParams。然后你的整个功能可以简化为:

    adb uninstall com.your.package.name
    

答案 2 :(得分:0)

可以使用此功能,我修改了@Takit Isy回答

function removeParameter(key) {
    var parameters = url; // document.location.search; // TAKIT: modified for test
    const regParameter = new RegExp(key + "=([a-zA-Z0-9_-]+[&]{0,1})");
    if (regParameter.test(parameters)) {
        parameters = parameters.replace(regParameter, '')
        if(parameters.substring(parameters.length-1)=='?' || parameters.substring(parameters.length-1)=='&'){
            parameters = parameters.slice(0, -1);
        }
    }
    return parameters; // TAKIT: Added
}