Entfernen Sie den Querystring aus der URL

143

Was ist eine einfache Möglichkeit, den Querystring aus einem Pfad in Javascript zu entfernen? Ich habe ein Plugin für Jquery gesehen, das window.location.search verwendet. Das kann ich nicht: Die URL ist in meinem Fall eine Variable, die von AJAX festgelegt wird.

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

Antworten:

345

Ein einfacher Weg, dies zu bekommen, ist:

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

Für diejenigen, die auch den Hash entfernen möchten (nicht Teil der ursprünglichen Frage), wenn kein Querystring vorhanden ist, erfordert dies etwas mehr:

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

BEARBEITEN

@caub (ursprünglich @crl) schlug eine einfachere Kombination vor, die sowohl für Abfragezeichenfolgen als auch für Hash funktioniert (obwohl RegExp verwendet wird, falls jemand ein Problem damit hat):

function getPathFromUrl(url) {
  return url.split(/[?#]/)[0];
}
Robusto
quelle
4
+1 ... Tatsächlich ist split () in diesem Fall besser als substring ().
Daniel Vassallo
10
Grenzoptimierung, wenn es darauf ankommt (wahrscheinlich nicht) : split('?', 1)[0].
Bobince
@ChristianVielma: Dies ?ist ein String-Literal, kein regulärer Ausdruck.
Robusto
@ Robusto Es tut mir leid, mein schlechtes ... Ich habe es in Java überprüft (was es als Regex interpretiert) :(
Christian Vielma
4
Hey Robusto, und warum nicht .split(/[?#]/)[0]?
Caub
32

2. Update: Um eine umfassende Antwort zu geben, vergleiche ich die drei in den verschiedenen Antworten vorgeschlagenen Methoden.

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

Ergebnisse in Firefox 3.5.8 unter Mac OS X 10.6.2:

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

Ergebnisse in Chrome 5.0.307.11 unter Mac OS X 10.6.2:

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

Beachten Sie, dass die Teilstring-Methode eine schlechtere Funktionalität aufweist, da sie eine leere Zeichenfolge zurückgibt, wenn die URL keinen Querystring enthält. Die beiden anderen Methoden würden erwartungsgemäß die vollständige URL zurückgeben. Es ist jedoch interessant festzustellen, dass die Teilzeichenfolgenmethode die schnellste ist, insbesondere in Firefox.


1. UPDATE: Tatsächlich ist die von Robusto vorgeschlagene split () -Methode eine bessere Lösung als die zuvor vorgeschlagene, da sie auch dann funktioniert, wenn kein Querystring vorhanden ist:

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"

Ursprüngliche Antwort:

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
testURL.substring(0, testURL.indexOf('?'));    // Returns: "/Products/List"
Daniel Vassallo
quelle
10
O_O Sehr umfassend, aber… warum? Die flexibelste und geeignetste Methode gewinnt offensichtlich, Geschwindigkeit spielt hier absolut keine Rolle.
Täuschung
1
@deceze: Nur aus Neugier ... Und weil es in den Kommentaren der Angus-Antwort ein Argument über die Leistung der Regex-Methode gab.
Daniel Vassallo
6
Sehr interessant, Daniel. Und wenn ich jemals 10K-URL-Parses auf einer Seite durchführen muss, werde ich nach einer anderen Arbeit suchen. :)
Robusto
Ich bin eigentlich ein bisschen überwältigt, dass man in 44ms 10.000 Regex-Matches machen kann. Ich denke, ich werde in Zukunft eher dazu neigen, sie zu nutzen.
TheGerm
12

Dies mag eine alte Frage sein, aber ich habe diese Methode versucht, um Abfrageparameter zu entfernen. Scheint für mich reibungslos zu funktionieren, da ich auch ein Neuladen in Kombination mit dem Entfernen von Abfrageparametern benötigte.

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

Da ich eine einfache Operation zum Hinzufügen von Zeichenfolgen verwende, schätze ich, dass die Leistung gut sein wird. Aber es lohnt sich immer noch, mit Ausschnitten in dieser Antwort zu vergleichen

damitj07
quelle
3

Ein einfacher Weg ist, wie folgt vorzugehen

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

Wenn Sie RegEx mögen ...

var newURL = testURL.match(new RegExp("[^?]+"))
Arbeitstier
quelle
1
Der reguläre Ausdruck ist langsam - gehen Sie mit dem einfachen schnellen Weg.
Aristos
1
@Angus: Ihre Schleife gibt Ihnen "Ein Skript ist möglicherweise beschäftigt ...", weil Sie vergessen haben, zu erhöhen a++;. Wenn ich die Tests behebe, erhalte ich in meinem Firefox 3.6 auf einem iMac 2.93Ghz Core 2 Duo 8 ms für die RegEx und 3 ms für die Split-Methode ... Trotzdem +1 für die Antwort, da dies noch eine weitere Option ist.
Daniel Vassallo
1
danke - ich habe es vor ein paar Minuten behoben! - aber der Punkt ist, wenn Sie 0,000005 Sekunden sprechen, auch für die reg exp Operation, Leistung ist kein Problem für eine Lösung :-)
plodder
1
match()gibt ein Objekt zurück. Das willst du wahrscheinlich nicht. Rufen Sie toString()es an (oder +'').
Bobince
1
Bob - guter Fang. Tatsächlich gibt es ein Array von Übereinstimmungen zurück - in diesem Fall ein Array von Zeichenfolgen. Also testURL.match (neues RegExp ("[^?] +")) [0] macht es
plodder
2
var path = "path/to/myfile.png?foo=bar#hash";

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

Wenn Sie backbone.js verwenden (das url anchorals Route enthält ), wird query stringmöglicherweise folgende URL angezeigt:

  1. vorher url anchor:

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

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

Lösung:

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

Ein Ansatz unter Verwendung des Standards 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
quelle
@Brad was macht das Protokoll aus, wenn er danach nur noch den Pfadnamen zurückgibt?
Der Narr
-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();
        }
})();

So habe ich es gemacht, hat auch RegEx-Unterstützung.

Javascript-Noob
quelle