Rimuovi querystring dall'URL


144

Qual è un modo semplice per rimuovere la stringa di query da un percorso in Javascript? Ho visto un plugin per Jquery che utilizza window.location.search. Non posso farlo: l'URL nel mio caso è una variabile impostata da AJAX.

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

Risposte:


346

Un modo semplice per ottenere questo è:

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

Per coloro che desiderano rimuovere anche l'hash (non parte della domanda originale) quando non esiste alcuna stringa di query , ciò richiede un po 'di più:

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

MODIFICARE

@caub (originariamente @crl) ha suggerito una combinazione più semplice che funziona sia per la stringa di query che per l'hash (sebbene utilizzi RegExp, nel caso in cui qualcuno abbia un problema):

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

4
+1 ... In realtà, split () è meglio di sottostringa () in questo caso.
Daniel Vassallo,

10
Ottimizzazione marginali se è importante (probabilmente non): split('?', 1)[0].
bobince,

@ChristianVielma: questa ?è una stringa letterale, non un'espressione regolare.
Robusto,

@Robusto Mi dispiace, mio ​​cattivo ... Lo stavo controllando in Java (che lo interpreta come una regex) :(
Christian Vielma,

4
Ehi Robusto, e perché no .split(/[?#]/)[0]?
caub

32

2 ° aggiornamento: nel tentativo di fornire una risposta completa, sto confrontando i tre metodi proposti nelle varie risposte.

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

Risultati in Firefox 3.5.8 su Mac OS X 10.6.2:

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

Risultati in Chrome 5.0.307.11 su Mac OS X 10.6.2:

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

Si noti che il metodo di sottostringa ha una funzionalità inferiore poiché restituisce una stringa vuota se l'URL non contiene una stringa di query. Gli altri due metodi restituiscono l'URL completo, come previsto. Tuttavia è interessante notare che il metodo di sottostringa è il più veloce, specialmente in Firefox.


1 ° AGGIORNAMENTO: In realtà il metodo split () suggerito da Robusto è una soluzione migliore di quella che ho suggerito in precedenza, poiché funzionerà anche quando non c'è 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"

Risposta originale:

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

10
O_O Davvero molto completo, ma ... perché? Il metodo più flessibile e appropriato ovviamente vince, la velocità qui non è assolutamente preoccupante.
Inganno

1
@deceze: Solo per curiosità ... E perché c'era un argomento sull'esecuzione del metodo regex nei commenti della risposta di Angus.
Daniel Vassallo,

6
Molto interessante, Daniel. E se dovessi mai eseguire analisi di 10K URL su una pagina, cercherò un'altra linea di lavoro. :)
Robusto

In realtà sono un po 'sbalordito dal fatto che si possano fare partite regex 10k in 44ms. In futuro, penso che sarò propenso a usarli di più.
TheGerm,

12

Questa potrebbe essere una vecchia domanda ma ho provato questo metodo per rimuovere i parametri della query. Sembra funzionare senza problemi per me dato che avevo bisogno di una ricarica e combinato con la rimozione dei parametri della query.

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

Anche dal momento che sto usando una semplice operazione di aggiunta di stringa, immagino che le prestazioni saranno buone. Ma vale ancora la pena confrontare con i frammenti in questa risposta


3

Un modo semplice è che puoi fare come segue

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

2

Se ti piace RegEx ....

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

1
il regexp è lento - vai con il modo semplice veloce.
Aristos,

1
@Angus: il tuo loop ti sta dando "Uno script potrebbe essere occupato ..." perché hai dimenticato di incrementare a++;. Riparando i test, nel mio Firefox 3.6 su un iMac 2.93Ghz Core 2 Duo, ottengo 8 ms per il RegEx e 3 ms per il metodo split ... Tuttavia +1 per la risposta, perché è ancora un'altra opzione.
Daniel Vassallo,

1
grazie - l'ho riparato pochi minuti fa! - ma il punto è quando parli 0,000005 secondi anche per l'operazione reg exp, le prestazioni non sono un problema per nessuna soluzione :-)
plodder

1
match()restituisce un oggetto. Probabilmente non lo vuoi. Chiamalo toString()(o +'').
Bobince,

1
Bob - buona cattura. In realtà restituisce una matrice di corrispondenze - una matrice di stringhe in questo caso. Quindi testURL.match (nuovo RegExp ("[^?] +")) [0] lo fa
plodder

2
var path = "path/to/myfile.png?foo=bar#hash";

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

2

Se si utilizza backbone.js (che contiene url anchorcome route), query stringpotrebbe essere visualizzato l' URL :

  1. prima url anchor:

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

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

Soluzione:

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

1

Un approccio che utilizza lo 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

@Brad cosa importa il protocollo quando tutto ciò che fa è restituire il percorso in seguito?
The Fool


-3
(() => {
        'use strict';
        const needle = 'SortOrder|Page'; // example
        if ( needle === '' || needle === '{{1}}' ) { 
            return; 
        }           
        const needles = needle.split(/\s*\|\s*/);
        const querystripper = ev => {
                    if (ev) { window.removeEventListener(ev.type, querystripper, true);}
                    try {
                          const url = new URL(location.href);
                          const params = new URLSearchParams(url.search.slice(1));
                          for (const needleremover of needles) {
                                if (params.has(needleremover)) {
                                url.searchParams.delete(needleremover);
                                    window.location.href = url;
                            }
                          }     
                    } catch (ex) { }
        };          
        if (document.readyState === 'loading') {
                 window.addEventListener('DOMContentLoaded', querystripper, true);
        } else {
                 querystripper();
        }
})();

È così che l'ho fatto, ha anche il supporto RegEx.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.