2014-10-08 59 views
1

我想创建一个函数来从url中删除特定的查询字符串和它的值。从URL中删除特定的查询字符串

对于如: 如果我有像

VAR URL中的URL = www.foo.com/test?name=kevin &性别=男& ID = 1234

如果我通过名称 - >它应该删除名称的键和值。该URL应该成为

www.foo.com/test?gender=Male & ID = 1234

我有一个函数ReturnRefinedURL(key,url)

和我在功能做这个

function ReturnRefinedURL(key,url) 
{ 
var Value = getParameterByName(key); // This returns kevin 
var stringToBeRemoved = 'key +'='+ Value+'&'; // string becomes 'name=kevin&' 
return url.replace(stringToBeRemoved, ''); 
} 

//在Google中找到它:

function getParameterByName(name) { 
    name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); 
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), 
     results = regex.exec(location.search); 
    return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); 
} 

所以当我调用该方法ReturnRefinedURL('name',window.location.href);

这工作!但寻找一种更优雅,更傻的方法。
*这不会工作,如果名称参数是查询字符串中的第二个。 (以下简称“&”仍将被保留)

回答

8

更多的搜索点点,然后你可以最终here

var url = "www.foo.com/test?name=kevin&gender=Male&id=1234"; 
function removeURLParameter(url, parameter) { 
    //prefer to use l.search if you have a location/link object 
    var urlparts= url.split('?'); 
    if (urlparts.length>=2) { 

     var prefix= encodeURIComponent(parameter)+'='; 
     var pars= urlparts[1].split(/[&;]/g); 

     //reverse iteration as may be destructive 
     for (var i= pars.length; i-- > 0;) {  
      //idiom for string.startsWith 
      if (pars[i].lastIndexOf(prefix, 0) !== -1) { 
       pars.splice(i, 1); 
      } 
     } 

     url= urlparts[0]+'?'+pars.join('&'); 
     return url; 
    } else { 
     return url; 
    } 
} 

console.log(removeURLParameter(url, 'name')); 
console.log(removeURLParameter(url, 'gender')); 

Jsfiddle example

+0

非常感谢..不知道我错过了链接。我没有搜索!:( – 2014-10-08 19:15:05

+0

您可以请提供一个解决方案,它可以添加参数的单击事件,也可以删除该事件的参数 即我想添加新的参数或更改现有参数的值,并删除一个单一的现有参数点击 – Hetal1311 2017-08-13 17:38:27

+0

可以更新区分大小写的问题吗? – Yiping 2017-10-26 07:08:49

1

你可以简单地这样做

function returnRefinedURL(key, url){ 
    return url.replace(new RegExp(key + "=\\w+"),"").replace("?&","?") 
    .replace("&&","&"); 
} 

测试的所有用例和上述作品完美。

+0

我想你的method..it工作正常,当我通过行业..但是当我通过类别..它打破..你能告诉我什么是错的?我试过的网址:''http://foo.com/en-gb/search-results?k=&l=&a=1&b=5&industry=technology%7c&jobCategories=ba%7cba%5cCOMMERCIAL%7cba%5cCORPORATE%7c' – 2014-10-08 18:43:01

0

我建议:

// obviously in real use, you could just access 'document.location' 
 
// within the function: 
 
function returnRefinedURL (key, url) { 
 
    // separating the key-value ('search') portion of the URL from the rest: 
 
    var urlParts = url.split('?'); 
 
    // if we have only a single array-element, or if the key to remove 
 
    // is not found in the URL, we quit here and return the same unchanged URL: 
 
    if (urlParts.length === 1 || url.indexOf(key) === -1) { 
 
     // there were no parameters, or the 
 
     // key wasn't present 
 
     return url; 
 
    } 
 
    else { 
 
     // otherwise, we split the key-value string on the '&' characters, 
 
     // for an array of key=value strings: 
 
     var keyValues = urlParts[1].split('&'), 
 
     // filtering that array: 
 
      refinedKeyValues = keyValues.filter(function (keyValuePair) { 
 
       // keeping only those array elements that don't /start with/ 
 
       // the key to be removed: 
 
       return keyValuePair.indexOf(key) !== 0; 
 
      // joining the key=value pairs back into a string: 
 
      }).join('&'); 
 
    } 
 
    // returning the refined URL: 
 
    return urlParts[0] + '?' + refinedKeyValues; 
 
} 
 

 
// beyond this point is entirely irrelevant, it's just for visual feedback: 
 
document.getElementById('output').textContent = returnRefinedURL('name', 'www.foo.com/test?name=kevin&gender=Male&id=1234');
#output::before { 
 
    content: 'output: '; 
 
}
<div id="output"></div>

参考文献: