从 URL 中删除查询字符串

IT技术 javascript jquery
2021-01-29 17:02:03

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

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

一个简单的方法是:

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];
}
@ChristianVielma:这?是一个字符串文字,而不是正则表达式。
2021-03-14 17:02:03
+1 ...在这种情况下,实际上 split() 比 substring() 更好。
2021-03-18 17:02:03
嘿罗布斯托,为什么不.split(/[?#]/)[0]呢?
2021-04-04 17:02:03
如果它的事项(可能不是)边际优化:split('?', 1)[0]
2021-04-05 17:02:03
@Robusto 对不起,我的错...我在 Java 中检查它(将它解释为正则表达式):(
2021-04-10 17:02:03

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

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。然而,有趣的是 substring 方法是最快的,尤其是在 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"
@deceze:只是出于好奇……而且因为在 Angus 的回答的评论中存在关于正则表达式方法性能的争论。
2021-03-19 17:02:03
一个人可以在 44 毫秒内完成 10k 次正则表达式匹配,我实际上有点惊讶。未来,我想我会更倾向于使用它们。
2021-03-25 17:02:03
非常有趣,丹尼尔。如果我不得不在一个页面上进行 10K 次 URL 解析,我将寻找另一行工作。:)
2021-04-05 17:02:03
O_O 确实很全面,但是……为什么?最灵活、最合适的方法显然是赢家,这里绝对不考虑速度。
2021-04-10 17:02:03

这可能是一个老问题,但我已经尝试过这种方法来删除查询参数。似乎对我来说工作顺利,因为我需要重新加载以及删除查询参数。

window.location.href = window.location.origin + window.location.pathname;

另外,因为我使用的是简单的字符串加法操作,所以我猜性能会很好。但仍然值得与此答案中的片段进行比较

最佳解决方案 IMO。是否有缺点或情况不起作用?
2021-03-21 17:02:03

我可以理解以前的事情是多么痛苦,在现代,你可以像下面这样超级轻松地得到这个

let url = new URL('https://example.com?foo=1&bar=2&foo=3');
let params = new URLSearchParams(url.search);

// Delete the foo parameter.
params.delete('foo'); //Query string is now: 'bar=2'

// now join the query param and host
let newUrl =  url.origin + '/' + params.toString();
var path = "path/to/myfile.png?foo=bar#hash";

console.log(
    path.replace(/(\?.*)|(#.*)/g, "")
);