Gibt es eine bessere Möglichkeit, einen Parameter aus einer Abfragezeichenfolge in einer URL-Zeichenfolge in Standard-JavaScript zu löschen, als einen regulären Ausdruck zu verwenden?
Folgendes habe ich mir bisher ausgedacht, was in meinen Tests zu funktionieren scheint, aber ich mag es nicht, das Querystring-Parsing neu zu erfinden!
function RemoveParameterFromUrl( url, parameter ) {
if( typeof parameter == "undefined" || parameter == null || parameter == "" ) throw new Error( "parameter is required" );
url = url.replace( new RegExp( "\\b" + parameter + "=[^&;]+[&;]?", "gi" ), "" ); "$1" );
// remove any leftover crud
url = url.replace( /[&;]$/, "" );
return url;
}
javascript
query-string
Matthew Lock
quelle
quelle
url= urlparts[0]+'?'+pars.join('&');
zuurl= urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : "");
Moderne Browser bieten eine
URLSearchParams
Schnittstelle für die Arbeit mit Suchparametern. Welches hatdelete
Methode, die param nach Namen entfernt.quelle
URLSearchParams
dies von IE, Edge 16 und iOS 10.2 Safari nicht unterstützt wird. (ref: caniuse.com/#feat=urlsearchparams )Von der Bobince-Antwort kopiert, aber Fragezeichen in der Abfragezeichenfolge unterstützt, z
http://www.google.com/search?q=test???+something&aq=f
Ist es gültig, mehr als ein Fragezeichen in einer URL zu haben?
quelle
???
Syntax ist ungültig und sollte niemals in einer URL vorkommen.return url.endsWith("?") ? url.slice(0,-1) : url;
, um den Fall abzudecken, in dem der zu entfernende Parameter der einzige in derIch sehe keine größeren Probleme mit einer Regex-Lösung. Vergessen Sie jedoch nicht, die Fragmentkennung (Text nach dem
#
) beizubehalten.Hier ist meine Lösung:
Und zu Bobince's Punkt, ja - Sie müssten
.
Zeichen in Parameternamen maskieren .quelle
url.replace(new RegExp('^([^#]*\?)(([^#]*)&)?' + parameter + '(\=[^&#]*)?(&|#|$)' ), '$1$3$5').replace(/^([^#]*)((\?)&|\?(#|$))/,'$1$3$4')
Sie können die URL ändern mit:
Auf diese Weise können Sie die URL ohne den Suchparameter überschreiben. Ich verwende sie, um die URL zu bereinigen, nachdem Sie die GET-Parameter übernommen haben.
quelle
Jeder, der an einer Regex-Lösung interessiert ist Ich habe diese Funktion zusammengestellt, um einen Querystring-Parameter hinzuzufügen / zu entfernen / zu aktualisieren. Wenn Sie keinen Wert angeben, wird der Parameter entfernt. Wenn Sie einen Wert angeben, wird der Parameter hinzugefügt / aktualisiert. Wenn keine URL angegeben wird, wird diese aus window.location abgerufen. Diese Lösung berücksichtigt auch den Anker der URL.
AKTUALISIEREN
Beim Entfernen des ersten Parameters im Querystring ist ein Fehler aufgetreten. Ich habe den regulären Ausdruck überarbeitet und getestet, um einen Fix einzuschließen.
UPDATE 2
@schellmax Update, um die Situation zu beheben, in der das Hashtag-Symbol verloren geht, wenn eine Querystring-Variable direkt vor einem Hashtag entfernt wird
quelle
UpdateQueryString('a', null, 'http://www.test.com?a=b#c');
url
für jede Ersatziteration ein immer kleiner werdendes Element definieren . Dies bedeutet jedoch, dass Sievalue
in die Argumente ein eingeben müssen , wodurch die Hälfte des Querystrings entfernt wird. Um dem entgegenzuwirken, verwenden Sieundefined
odernull
fürvalue
Argumente wie:url_from_last_iteration = UpdateQueryString(current_ignore_key, undefined/null, url_from_last_iteration);
Angenommen, Sie möchten den Parameter key = val aus dem URI entfernen:
quelle
/([&?]key=val*$|key=val&|[?&]key=val(?=#))/
erforderlich und kann zu Linterfehlern führen: Kann vorzuziehen sein, wenn ein Linter wie eslintFolgendes verwende ich:
Ursprüngliche URL: http://www.example.com/test/hello?id=123&foo=bar
Ziel-URL: http://www.example.com/test/hello
quelle
Hier ist eine vollständige Funktion zum Hinzufügen und Entfernen von Parametern basierend auf dieser Frage und diesem Github-Kern: https://gist.github.com/excalq/2961415
Sie können folgende Parameter hinzufügen:
Und entfernen Sie es so:
In diesem Thread sagten viele, dass der Regex wahrscheinlich nicht die beste / stabilste Lösung ist ... also bin ich mir nicht 100% sicher, ob dieses Ding einige Mängel hat, aber soweit ich es getestet habe, funktioniert es ziemlich gut.
quelle
Dies ist ein sauberer Abfrageparameter zum Entfernen von Versionen mit der URL-Klasse für heutige Browser:
URLSearchParams werden in alten Browsern nicht unterstützt
https://caniuse.com/#feat=urlsearchparams
IE, Edge (unter 17) und Safari (unter 10.3) unterstützen URLSearchParams innerhalb der URL-Klasse nicht.
Polyfills
URLSearchParams nur Polyfill
https://github.com/WebReflection/url-search-params
Vervollständigen Sie Polyfill URL und URLSearchParams, um den letzten WHATWG-Spezifikationen zu entsprechen
https://github.com/lifaon74/url-polyfill
quelle
Verwenden von jQuery:
quelle
Die obige Version als Funktion
quelle
Sie sollten eine Bibliothek verwenden, um URI-Manipulationen durchzuführen, da dies komplizierter ist, als es an der Oberfläche scheint, dies selbst zu tun. Schauen Sie sich Folgendes an: http://medialize.github.io/URI.js/
quelle
Soweit ich sehen kann, kann keiner der oben genannten Parameter mit normalen Parametern und Array-Parametern umgehen. Hier ist eine, die es tut.
Wie man es benutzt:
Um einen Parameter zu aktualisieren, entfernen Sie ihn einfach und fügen Sie ihn hinzu. Fühlen Sie sich frei, eine Dummy-Funktion dafür zu machen.
quelle
path.replace(new RegExp("&?"+param+"=[\\w]+", "g"), "");
Ich würde den[\\w]*
regulären Ausdruck so ändern , dass er Parameter wie "param =" ohne Werte enthält.Alle Antworten in diesem Thread haben den Fehler, dass Anker- / Fragmentteile von URLs nicht erhalten bleiben.
Wenn Ihre URL also so aussieht:
und Sie ersetzen 'Parameter'
Sie verlieren Ihren Fragmenttext.
Das Folgende ist eine Anpassung früherer Antworten (Bobince via LukePH), die dieses Problem angehen:
quelle
url = urlBase+'?'+pars.join('&');
zuurl = urlBase + (pars.length > 0 ? '?' + pars.join('&') : "");
Hier eine Lösung, die:
?
wenn der letzte Parameter entfernt wurdeHinweis: Wie in anderen Antworten erwähnt, wird URLSearchParams im IE nicht unterstützt. Verwenden Sie daher eine Polyfüllung .
quelle
Wenn es sich um eine Instanz von handelt
URL
, verwenden Sie diedelete
Funktion vonsearchParams
quelle
Eine andere direkte und einfachere Antwort wäre
quelle
Eine modifizierte Version der Lösung von ssh_imov
Rufen Sie so an
quelle
Dies gibt die URL ohne ANY GET-Parameter zurück:
quelle
Ich habe praktisch die folgende Funktion geschrieben, um die URL-Parameter zu verarbeiten und den endgültigen Status als Zeichenfolge zu erhalten und die Seite umzuleiten. Hoffentlich profitiert es.
Wenn ich beispielsweise auf eine Schaltfläche klicke, soll der Seitenwert gelöscht und der Kategoriewert hinzugefügt werden.
Ich finde es sehr nützlich!
quelle
Ich bin froh, dass du hier gescrollt hast.
Ich würde Ihnen vorschlagen, diese Aufgabe durch die nächsten möglichen Lösungen zu lösen:
http://google.com/?myparm
http://google.com/?myparm=1
http://google.com?qp=1&qpqp=2&qp=1
for
Schleife und ändert das Array während der Schleife nichtFunktioniert in IE> 9 (ES5-Version)
Ausgefallene ES6-Version
Sehen Sie hier, wie es funktioniert
quelle
quelle
quelle
Wenn Sie sich für jQuery interessieren, gibt es ein gutes Plugin zur Manipulation von Abfragezeichenfolgen:
quelle
quelle