Gibt es eine bessere Möglichkeit, einen Parameter aus einer Abfragezeichenfolge in einer URL-Zeichenfolge in Standard-JavaScript zu löschen, anstatt einen regulären Ausdruck zu verwenden?
Hier ist das, was ich bisher gefunden habe, was in meinen Tests zu funktionieren scheint, aber ich möchte das Querystring-Parsing nicht neu 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;
}
"[&;]?" + parameter + "=[^&;]+"
Scheint gefährlich zu sein, da der Parameter ″ bar ″ mit folgendem übereinstimmt:
?a=b&foobar=c
Es würde auch fehlschlagen, wenn parameter
Zeichen enthält, die in RegExp speziell sind, z. B.. Und es ist kein globaler Regex, also würde nur eine Instanz des Parameters entfernt.
Ich würde dafür kein einfaches RegExp verwenden, ich würde die Parameter darin analysieren und diejenigen verlieren, die Sie nicht wollen.
function removeURLParameter(url, parameter) {
//prefer to use l.search if you have a location/link object
var urlparts = url.split('?');
if (urlparts.length >= 2) {
var prefix = encodeURIComponent(parameter) + '=';
var pars = urlparts[1].split(/[&;]/g);
//reverse iteration as may be destructive
for (var i = pars.length; i-- > 0;) {
//idiom for string.startsWith
if (pars[i].lastIndexOf(prefix, 0) !== -1) {
pars.splice(i, 1);
}
}
return urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : '');
}
return url;
}
Kopiert von bobince answer, unterstützt jedoch Fragezeichen in der Abfragezeichenfolge, z
http://www.google.com/search?q=test??++something&aq=f
Ist es zulässig, mehr als ein Fragezeichen in einer URL zu haben?
function removeUrlParameter(url, parameter) {
var urlParts = url.split('?');
if (urlParts.length >= 2) {
// Get first part, and remove from array
var urlBase = urlParts.shift();
// Join it back up
var queryString = urlParts.join('?');
var prefix = encodeURIComponent(parameter) + '=';
var parts = queryString.split(/[&;]/g);
// Reverse iteration as may be destructive
for (var i = parts.length; i-- > 0; ) {
// Idiom for string.startsWith
if (parts[i].lastIndexOf(prefix, 0) !== -1) {
parts.splice(i, 1);
}
}
url = urlBase + '?' + parts.join('&');
}
return url;
}
Ich 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:
function RemoveParameterFromUrl(url, parameter) {
return url
.replace(new RegExp('[?&]' + parameter + '=[^&#]*(#.*)?$'), '$1')
.replace(new RegExp('([?&])' + parameter + '=[^&]*&'), '$1');
}
Und um es auf den Punkt zu bringen: Ja, Sie müssen .
-Zeichen in Parameternamen mit Escapezeichen versehen.
Jedem, der an einer Regex-Lösung interessiert ist, habe ich diese Funktion zum Hinzufügen/Entfernen/Aktualisieren eines Querystring-Parameters zusammengestellt. 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 sie von window.location abgerufen. Diese Lösung berücksichtigt auch den Anker der URL.
function UpdateQueryString(key, value, url) {
if (!url) url = window.location.href;
var re = new RegExp("([?&])" + key + "=.*?(&|#|$)(.*)", "gi"),
hash;
if (re.test(url)) {
if (typeof value !== 'undefined' && value !== null)
return url.replace(re, '$1' + key + "=" + value + '$2$3');
else {
hash = url.split('#');
url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '');
if (typeof hash[1] !== 'undefined' && hash[1] !== null)
url += '#' + hash[1];
return url;
}
}
else {
if (typeof value !== 'undefined' && value !== null) {
var separator = url.indexOf('?') !== -1 ? '&' : '?';
hash = url.split('#');
url = hash[0] + separator + key + '=' + value;
if (typeof hash[1] !== 'undefined' && hash[1] !== null)
url += '#' + hash[1];
return url;
}
else
return url;
}
}
UPDATE
Beim Entfernen des ersten Parameters in der Querzeichenfolge ist ein Fehler aufgetreten. Ich habe die Regex und den Test überarbeitet, um eine Korrektur hinzuzufügen.
UPDATE 2
@schellmax-Update zur Behebung einer Situation, in der das Hashtag-Symbol verloren geht, wenn eine Querystring-Variable direkt vor einem Hashtag entfernt wird
Moderne Browser bieten URLSearchParams
Schnittstelle für die Arbeit mit Suchparametern. Welche Methode hat delete
, die param nach Namen entfernt.
if (typeof URLSearchParams !== 'undefined') {
const params = new URLSearchParams('param1=1¶m2=2¶m3=3')
console.log(params.toString())
params.delete('param2')
console.log(params.toString())
} else {
console.log(`Your browser ${navigator.appVersion} does not support URLSearchParams`)
}
Angenommen, Sie möchten den Parameter key = val aus dem URI entfernen:
function removeParam(uri) {
return uri.replace(/([&\?]key=val*$|key=val&|[?&]key=val(?=#))/, '');
}
Hier ist eine vollständige Funktion zum Hinzufügen und Entfernen von Parametern basierend auf dieser Frage und diesem Github Gist: https://Gist.github.com/excalq/2961415
var updateQueryStringParam = function (key, value) {
var baseUrl = [location.protocol, '//', location.Host, location.pathname].join(''),
urlQueryString = document.location.search,
newParam = key + '=' + value,
params = '?' + newParam;
// If the "search" string exists, then build params from it
if (urlQueryString) {
updateRegex = new RegExp('([\?&])' + key + '[^&]*');
removeRegex = new RegExp('([\?&])' + key + '=[^&;]+[&;]?');
if( typeof value == 'undefined' || value == null || value == '' ) { // Remove param if value is empty
params = urlQueryString.replace(removeRegex, "$1");
params = params.replace( /[&;]$/, "" );
} else if (urlQueryString.match(updateRegex) !== null) { // If param exists already, update it
params = urlQueryString.replace(updateRegex, "$1" + newParam);
} else { // Otherwise, add it to end of query string
params = urlQueryString + '&' + newParam;
}
}
window.history.replaceState({}, "", baseUrl + params);
};
Sie können Parameter wie folgt hinzufügen:
updateQueryStringParam( 'myparam', 'true' );
Und entferne es so:
updateQueryStringParam( 'myparam', null );
In diesem Thread sagten viele, dass der Regex wahrscheinlich nicht die beste/stabile Lösung ist ... also bin ich nicht 100% sicher, ob dieses Ding einige Mängel aufweist, aber soweit ich es getestet habe, funktioniert es ziemlich gut.
Sie können die URL mit ändern:
window.history.pushState({}, document.title, window.location.pathname);
auf diese Weise können Sie die URL ohne den Suchparameter überschreiben. Ich verwende sie zum Bereinigen der URL, nachdem die GET-Parameter übernommen wurden.
Die obige Version als Funktion
function removeURLParam(url, param)
{
var urlparts= url.split('?');
if (urlparts.length>=2)
{
var prefix= encodeURIComponent(param)+'=';
var pars= urlparts[1].split(/[&;]/g);
for (var i=pars.length; i-- > 0;)
if (pars[i].indexOf(prefix, 0)==0)
pars.splice(i, 1);
if (pars.length > 0)
return urlparts[0]+'?'+pars.join('&');
else
return urlparts[0];
}
else
return url;
}
JQuery verwenden:
function removeParam(key) {
var url = document.location.href;
var params = url.split('?');
if (params.length == 1) return;
url = params[0] + '?';
params = params[1];
params = params.split('&');
$.each(params, function (index, value) {
var v = value.split('=');
if (v[0] != key) url += value + '&';
});
url = url.replace(/&$/, '');
url = url.replace(/\?$/, '');
document.location.href = url;
}
Sie sollten eine Bibliothek verwenden, um die URI-Manipulation durchzuführen, da es komplizierter ist, als es auf den ersten Blick erscheint, um es selbst auszuführen. Werfen Sie einen Blick auf: http://medialize.github.io/URI.js/
Alle Antworten in diesem Thread haben den Nachteil, dass Anker-/Fragmentteile von URLs nicht beibehalten werden.
Wenn Ihre URL also so aussieht:
http://dns-entry/path?parameter=value#fragment-text
und Sie ersetzen 'Parameter'
sie verlieren Ihren Fragmenttext.
Das Folgende ist eine Anpassung der vorherigen Antworten (Bobince über LukePH), die dieses Problem ansprechen:
function removeParameter(url, parameter)
{
var fragment = url.split('#');
var urlparts= fragment[0].split('?');
if (urlparts.length>=2)
{
var urlBase=urlparts.shift(); //get first part, and remove from array
var queryString=urlparts.join("?"); //join it back up
var prefix = encodeURIComponent(parameter)+'=';
var pars = queryString.split(/[&;]/g);
for (var i= pars.length; i-->0;) { //reverse iteration as may be destructive
if (pars[i].lastIndexOf(prefix, 0)!==-1) { //idiom for string.startsWith
pars.splice(i, 1);
}
}
url = urlBase + (pars.length > 0 ? '?' + pars.join('&') : '');
if (fragment[1]) {
url += "#" + fragment[1];
}
}
return url;
}
Folgendes verwende ich:
if (location.href.includes('?')) {
history.pushState({}, null, location.href.split('?')[0]);
}
Ursprüngliche URL: http://www.example.com/test/hello?id=123&foo=bar
Ziel-URL: http://www.example.com/test/hello
Soweit ich sehen kann, kann keiner der oben genannten Parameter normale Parameter und Array-Parameter verarbeiten. Hier ist einer, der das tut.
function removeURLParameter(param, url) {
url = decodeURI(url).split("?");
path = url.length == 1 ? "" : url[1];
path = path.replace(new RegExp("&?"+param+"\\[\\d*\\]=[\\w]+", "g"), "");
path = path.replace(new RegExp("&?"+param+"=[\\w]+", "g"), "");
path = path.replace(/^&/, "");
return url[0] + (path.length
? "?" + path
: "");
}
function addURLParameter(param, val, url) {
if(typeof val === "object") {
// recursively add in array structure
if(val.length) {
return addURLParameter(
param + "[]",
val.splice(-1, 1)[0],
addURLParameter(param, val, url)
)
} else {
return url;
}
} else {
url = decodeURI(url).split("?");
path = url.length == 1 ? "" : url[1];
path += path.length
? "&"
: "";
path += decodeURI(param + "=" + val);
return url[0] + "?" + path;
}
}
Wie man es benutzt:
url = location.href;
-> http://example.com/?tags[]=single&tags[]=promo&sold=1
url = removeURLParameter("sold", url)
-> http://example.com/?tags[]=single&tags[]=promo
url = removeURLParameter("tags", url)
-> http://example.com/
url = addURLParameter("tags", ["single", "promo"], url)
-> http://example.com/?tags[]=single&tags[]=promo
url = addURLParameter("sold", 1, url)
-> http://example.com/?tags[]=single&tags[]=promo&sold=1
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 erstellen.
Eine modifizierte Version der Lösung von ssh_imov
function removeParam(uri, keyValue) {
var re = new RegExp("([&\?]"+ keyValue + "*$|" + keyValue + "&|[?&]" + keyValue + "(?=#))", "i");
return uri.replace(re, '');
}
Rufe so an
removeParam("http://google.com?q=123&q1=234&q2=567", "q1=234");
// returns http://google.com?q=123&q2=567
Dies gibt die URL ohne ANY GET-Parameter zurück:
var href = document.location.href;
var search = document.location.search;
var pos = href.indexOf( search );
if ( pos !== -1 ){
href = href.slice( 0, pos );
console.log( href );
}
Dies ist eine saubere Version remove Abfrageparameter mit der URL-Klasse für heutige Browser:
function removeUrlParameter(url, paramKey)
{
var r = new URL(url);
r.searchParams.delete(paramKey);
return r.href;
}
URLSearchParams wird von alten Browsern nicht unterstützt
https://caniuse.com/#feat=urlsearchparams
IE, Edge (unter 17) und Safari (unter 10.3) unterstützen URLSearchParams in der URL-Klasse nicht.
Polyfills
URLSearchParams nur Polyfill
https://github.com/WebReflection/url-search-params
Vervollständigen Sie die URL und die URLSearchParams von Polyfill, um die letzten WHATWG-Spezifikationen zu erfüllen