从URL中删除查询字符串

Mat*_*s F 130 javascript jquery

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

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3&SortOrder=dsc'
Run Code Online (Sandbox Code Playgroud)

Rob*_*sto 323

一个简单的方法是:

function getPathFromUrl(url) {
  return url.split("?")[0];
}
Run Code Online (Sandbox Code Playgroud)

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

function stripQueryStringAndHashFromPath(url) {
  return url.split("?")[0].split("#")[0];
}
Run Code Online (Sandbox Code Playgroud)

编辑

@caub(最初是@crl)提出了一个更简单的组合,它适用于查询字符串和哈希(虽然它使用RegExp,以防任何人遇到问题):

function getPathFromUrl(url) {
  return url.split(/[?#]/)[0];
}
Run Code Online (Sandbox Code Playgroud)

  • 边际优化是否重要(可能不重要):`split('?',1)[0]`. (10认同)
  • +1 ......实际上,split()在这种情况下优于substring(). (4认同)
  • 嘿Robusto,为什么不``.split(/ [?#] /)[0]`? (4认同)

Dan*_*llo 32

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

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');
Run Code Online (Sandbox Code Playgroud)

Mac OS X 10.6.2上的Firefox 3.5.8中的结果:

10k substring:  16ms
10k split:      25ms
10k regex:      44ms
Run Code Online (Sandbox Code Playgroud)

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

10k substring:  14ms
10k split:      20ms
10k regex:      15ms
Run Code Online (Sandbox Code Playgroud)

请注意,substring方法的功能较差,因为如果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"
Run Code Online (Sandbox Code Playgroud)

原答案:

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

  • O_O非常全面,但是......为什么?最灵活和最合适的方法显然是胜利,速度在这里绝对不用担心. (10认同)
  • 非常有趣,丹尼尔.如果我必须在页面上进行10K URL解析,我将寻求另一项工作.:) (6认同)
  • 停止.微.标杆.使用最具可读性的东西. (4认同)
  • @deceze:只是出于好奇......并且因为在 Angus 答案的评论中存在关于正则表达式方法的性能的争论。 (2认同)

use*_*755 22

var u = new URL('https://server.de/test?q#h')
u.hash = ''
u.search = ''
console.log(u.toString())
Run Code Online (Sandbox Code Playgroud)


Cod*_*ker 7

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

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();
Run Code Online (Sandbox Code Playgroud)

  • `let params = url.searchParams` 就足够了。 (4认同)

dam*_*j07 6

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

window.location.href = window.location.origin + window.location.pathname;
Run Code Online (Sandbox Code Playgroud)

另外,由于我使用简单的字符串加法运算,所以我猜性能会很好。但是仍然值得与这个答案中的片段进行比较


小智 -1

使用URL

删除特定参数:

const url = new URL('https://example.com?foo=1&bar=2');
url.searchParams.delete("foo");
console.log(url.href);
Run Code Online (Sandbox Code Playgroud)

删除所有参数:

const url = new URL('https://example.com?foo=1&bar=2');
url.search = "";
console.log(url.href);
Run Code Online (Sandbox Code Playgroud)