Remover querystring do URL

O que é uma maneira fácil de remover a querystring de um caminho em JavaScript? Eu vi um plugin para Jquery que usa window.location.search. Eu não posso fazer isso: A URL no meu caso é uma variável que é definida a partir do AJAX.

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

Uma maneira fácil de conseguir isso é:

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

Para aqueles que também desejam remover o hash (não faz parte da pergunta original) quando não existe querystring , isso requer um pouco mais:

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

EDITAR

@caub (originalmente @crl) sugeriu um combo mais simples que funciona tanto para a string de consulta quanto para o hash (embora use o RegExp, caso alguém tenha um problema com isso):

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

2ª atualização: Na tentativa de fornecer uma resposta abrangente, estou comparando os três methods propostos nas várias respostas.

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

Resultados no Firefox 3.5.8 no Mac OS X 10.6.2:

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

Resultados no Chrome 5.0.307.11 no Mac OS X 10.6.2:

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

Observe que o método de substring é inferior na funcionalidade, pois retorna uma string em branco se a URL não contiver uma string de consulta. Os outros dois methods retornariam o URL completo, conforme o esperado. No entanto, é interessante notar que o método de substring é o mais rápido, especialmente no Firefox.


1ª ATUALIZAÇÃO: Na verdade o método split () sugerido por Robusto é uma solução melhor que a que eu sugeri anteriormente, já que funcionará mesmo quando não houver 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" 

Resposta Original:

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

Uma maneira simples é que você pode fazer o seguinte

 public static String stripQueryStringAndHashFromPath(String uri) { return uri.replaceAll(("(\\?.*|\\#.*)"), ""); } 

Se você está em RegEx ….

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

Essa pode ser uma pergunta antiga, mas tentei esse método para remover parâmetros de consulta. Parece funcionar bem para mim, pois eu precisava de um recarregamento, bem como a remoção de parâmetros de consulta.

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

Também desde que eu estou usando a operação de adição de seqüência de caracteres simples, eu estou supondo que o desempenho será bom. Mas ainda vale a pena comparar com trechos nesta resposta

 var path = "path/to/myfile.png?foo=bar#hash"; console.log( path.replace(/(\?.*)|(#.*)/g, "") ); 

Se você precisa executar uma operação complexa na URL, você pode dar uma olhada no plugin do analisador de url da jQuery .

Se estiver usando backbone.js (que contém a url anchor como rota), a query string URL poderá aparecer:

  1. antes da url anchor :

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

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

Solução:

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