从URL中删除查询string

什么是一个简单的方法来删除Javascript中的path查询string? 我见过一个使用window.location.search的Jquery插件。 我不能这样做:在我的情况下,url是从AJAX设置的variables。

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3&SortOrder=dsc' 

一个简单的方法得到这个是:

 function getPathFromUrl(url) { return url.split("?")[0]; } 

对于那些也希望删除哈希 (不是原来的问题的一部分), 当没有查询string存在 ,这需要多一点:

 function stripQueryStringAndHashFromPath(url) { return url.split("?")[0].split("#")[0]; } 

编辑

@caub(最初@crl)提出了一个更简单的组合,适用于查询string和散列(虽然它使用RegExp,万一任何人有问题):

 function getPathFromUrl(url) { return url.split(/[?#]/)[0]; } 

第二次更新:为了提供一个全面的答案,我正在对各种答案中提出的三种方法进行基准testing。

 var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3'; var i; // Testing the substring method i = 0; console.time('10k substring'); while (i < 10000) { testURL.substring(0, testURL.indexOf('?')); i++; } console.timeEnd('10k substring'); // Testing the split method i = 0; console.time('10k split'); while (i < 10000) { testURL.split('?')[0]; i++; } console.timeEnd('10k split'); // Testing the RegEx method i = 0; var re = new RegExp("[^?]+"); console.time('10k regex'); while (i < 10000) { testURL.match(re)[0]; i++; } console.timeEnd('10k regex'); 

Mac OS X 10.6.2上Firefox 3.5.8的结果:

 10k substring: 16ms 10k split: 25ms 10k regex: 44ms 

Mac OS X 10.6.2上的Chrome 5.0.307.11中的结果:

 10k substring: 14ms 10k split: 20ms 10k regex: 15ms 

请注意,substring方法在function上比较差,因为如果URL不包含查询string,它将返回一个空string。 如预期的那样,其他两种方法将返回完整的URL。 不过有趣的是,子串方法是最快的,特别是在Firefox中。


第一个更新:实际上,Robustobuild议的split()方法是我之前提出的更好的解决scheme,因为即使没有查询string,它也能工作:

 var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3'; testURL.split('?')[0]; // Returns: "/Products/List" var testURL2 = '/Products/List'; testURL2.split('?')[0]; // Returns: "/Products/List" 

原始答案:

 var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3'; testURL.substring(0, testURL.indexOf('?')); // Returns: "/Products/List" 

如果你正在注册RegEx ….

 var newURL = testURL.match(new RegExp("[^?]+")) 

一个简单的方法是你可以做如下

 public static String stripQueryStringAndHashFromPath(String uri) { return uri.replaceAll(("(\\?.*|\\#.*)"), ""); } 
 var path = "path/to/myfile.png?foo=bar#hash"; console.log( path.replace(/(\?.*)|(#.*)/g, "") ); 

如果使用backbone.js(包含url anchor作为路由),则可能会出现url query string

  1. 之前的url anchor

     var url = 'http://example.com?a=1&b=3#routepath/subpath'; 
  2. 经过url anchor

     var url = 'http://example.com#routepath/subpath?a=1&b=3'; 

解:

 window.location.href.replace(window.location.search, ''); // run as: 'http://example.com#routepath/subpath?a=1&b=3'.replace('?a=1&b=3', ''); 

如果你需要在URL上执行复杂的操作,你可以看看jQuery urlparsing器插件 。