204

What is an easy way to remove the querystring from a Path in Javascript? I have seen a plugin for Jquery that uses window.location.search. I can not do that: The URL in my case is a variable that is set from AJAX.

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

Edit after 13 years

At some point in the last decade Javascript got some Url handling.

Mathias F
  • 15,906
  • 22
  • 89
  • 159

11 Answers11

435

An easy way to get this is:

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

For those who also wish to remove the hash (not part of the original question) when no querystring exists, that requires a little bit more:

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

EDIT

@caub (originally @crl) suggested a simpler combo that works for both query string and hash (though it uses RegExp, in case anyone has a problem with that):

function getPathFromUrl(url) {
  return url.split(/[?#]/)[0];
}
Robusto
  • 31,447
  • 8
  • 56
  • 77
37

2nd Update: In attempt to provide a comprehensive answer, I am benchmarking the three methods proposed in the various answers.

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');

Results in Firefox 3.5.8 on Mac OS X 10.6.2:

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

Results in Chrome 5.0.307.11 on Mac OS X 10.6.2:

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

Note that the substring method is inferior in functionality as it returns a blank string if the URL does not contain a querystring. The other two methods would return the full URL, as expected. However it is interesting to note that the substring method is the fastest, especially in Firefox.


1st UPDATE: Actually the split() method suggested by Robusto is a better solution that the one I suggested earlier, since it will work even when there is no querystring:

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"

Original Answer:

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
testURL.substring(0, testURL.indexOf('?'));    // Returns: "/Products/List"
Community
  • 1
  • 1
Daniel Vassallo
  • 337,827
  • 72
  • 505
  • 443
  • 13
    O_O Very comprehensive indeed, but… why? The most flexible and appropriate method obviously wins, speed is of absolutely no concern here. – deceze Mar 29 '10 at 23:57
  • 2
    @deceze: Just for curiosity... And because there was an argument about the performance of the regex method in the comments of the Angus' answer. – Daniel Vassallo Mar 30 '10 at 00:03
  • 7
    Very interesting, Daniel. And if I ever have to do 10K URL parses on a page I'm going to seek another line of work. :) – Robusto Mar 30 '10 at 01:35
  • 1
    I'm actually a bit blown away that one can do 10k regex matches in 44ms. In the future, I think I will be inclined to use them more. – TheGerm Sep 17 '12 at 18:04
28

This may be an old question but I have tried this method to remove query params. Seems to work smoothly for me as I needed a reload as well combined with removing of query params.

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

Also since I am using simple string addition operation I am guessing the performance will be good. But Still worth comparing with snippets in this answer

damitj07
  • 2,689
  • 1
  • 21
  • 40
  • Best solution IMO. Are there are downsides or cases where this won't work? – Daniel Oct 14 '21 at 12:33
  • The reason is that the OP specifically states that they can't use window.location and have to operate on a bare string exclusively. – Robusto Jun 29 '22 at 23:23
17

var u = new URL('https://server.de/test?q#h')
u.hash = ''
u.search = ''
console.log(u.toString())
user1050755
  • 11,218
  • 4
  • 45
  • 56
7

I can understand how painful things were before, In modern days you can get this super easily like below

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();
Code Cooker
  • 881
  • 14
  • 19
4
var path = "path/to/myfile.png?foo=bar#hash";

console.log(
    path.replace(/(\?.*)|(#.*)/g, "")
);
yckart
  • 32,460
  • 9
  • 122
  • 129
2

A simple way is you can do as follows

public static String stripQueryStringAndHashFromPath(String uri) {
 return uri.replaceAll(("(\\?.*|\\#.*)"), "");
}
karthik m
  • 717
  • 1
  • 8
  • 7
2

An approach using the standard URL:

/**
 * @param {string} path - A path starting with "/"
 * @return {string}
 */
function getPathname(path) {
  return new URL(`http://_${path}`).pathname
}

getPathname('/foo/bar?cat=5') // /foo/bar
golopot
  • 10,726
  • 6
  • 37
  • 51
1

If you're into RegEx....

var newURL = testURL.match(new RegExp("[^?]+"))
plodder
  • 2,304
  • 18
  • 19
  • 1
    the regexp is slow one - go with the easy fast way. – Aristos Mar 29 '10 at 20:49
  • Not for this operation it isn't. 1000 ops on a long URL takes 5ms in firefox – plodder Mar 29 '10 at 20:58
  • 1
    @Angus: Your loop is giving you "A script may be busy..." because you forgot to increment `a++;`. Fixing the tests, in my Firefox 3.6 on an iMac 2.93Ghz Core 2 Duo, I get 8ms for the RegEx, and 3ms for the split method... Nevertheless +1 for the answer, because it is still another option. – Daniel Vassallo Mar 29 '10 at 21:20
  • 1
    thanks - I fixed it a few mins ago! - but the point is when you are talking 0.000005 seconds even for the reg exp operation, performance is not an issue for any solution :-) – plodder Mar 29 '10 at 21:21
  • 1
    `match()` returns an object. You probably don't want that. Call `toString()` on it (or `+''`). – bobince Mar 29 '10 at 22:55
  • 1
    Bob - good catch. Actually it returns an array of matches - an Array of strings in this case. So testURL.match(new RegExp("[^?]+"))[0] does it – plodder Mar 29 '10 at 23:10
0

If using backbone.js (which contains url anchor as route), url query string may appear:

  1. before url anchor:

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

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

Solution:

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

Using URL

Removing specific param:

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

Removing all params:

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