从 URL 中删除查询字符串

2022-08-30 01:28:55

在Javascript中从Path中删除查询字符串的简单方法是什么?我见过一个使用window.location.search的Jquery插件。我不能这样做:在我的情况下,URL是从AJAX设置的变量。

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

答案 1

获得此目的的一种简单方法是:

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

对于那些也希望在没有查询字符串的情况下删除哈希(不是原始问题的一部分)的人来说,这需要更多一点:

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

编辑

@caub(最初@crl)建议使用一种更简单的组合,该组合适用于查询字符串和哈希(尽管它使用RegExp,以防有人对此有疑问):

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

答案 2

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

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

请注意,子字符串方法的功能较差,因为如果 URL 不包含查询字符串,它将返回一个空白字符串。其他两种方法将返回完整的 URL,如预期的那样。然而,有趣的是,子字符串方法是最快的,特别是在Firefox中。


第一次更新:实际上,Robusto建议的split()方法是一个比我之前建议的解决方案更好的解决方案,因为它即使没有查询字符串也可以工作:

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"