Wie kann ich einen Abfrage-String-Parameter in JavaScript löschen?
-
06-07-2019 - |
Frage
Gibt es eine bessere Art und Weise einen Parameter aus einem Abfrage-String in einer URL-Zeichenfolge in Standard JavaScript anders als durch die Verwendung eines regulären Ausdrucks?
zu löschenHier ist, was ich mit so weit habe kommen, die in meinen Tests scheinen zu funktionieren, aber ich weiß nicht neu zu erfinden, wie Abfragezeichen Parsen!
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;
}
Lösung
"[&;]?" + parameter + "=[^&;]+"
Es scheint gefährlich, weil es Parameter ‚bar‘ passen würde:
?a=b&foobar=c
Auch wäre es fehl, wenn parameter
alle Zeichen enthalten, die in RegExp, wie Sonder sind ‚‘. Und es ist nicht eine globale Regex, so dass es nur eine Instanz des Parameters entfernen würde.
Ich würde nicht ein einfaches RegExp für diese, ich die Parameter analysieren würde in und verlieren die, 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;
}
Andere Tipps
von bobince Antwort kopiert, aber es Unterstützung Fragezeichen in dem Abfrage-String gemacht, zB
http://www.google.com/search?q = Test ??? + etwas & aq = f
Ist es gültig mehr als ein Fragezeichen in einer URL 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;
}
Moderne Browser bieten URLSearchParams
Schnittstelle mit Such params zu arbeiten. Was hat delete
Methode, die param mit 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`)
}
Ich sehe keine größeren Probleme mit einer regex Lösung. Aber vergessen Sie nicht die Fragmentbezeichner (Text nach dem #
) zu bewahren.
Hier ist meine Lösung:
function RemoveParameterFromUrl(url, parameter) {
return url
.replace(new RegExp('[?&]' + parameter + '=[^&#]*(#.*)?$'), '$1')
.replace(new RegExp('([?&])' + parameter + '=[^&]*&'), '$1');
}
Und Punkt des bobince, ja -. Sie bräuchten .
Zeichen in Parameternamen zu entkommen
Wer Interesse an einer regex Lösung, die ich diese Funktion gesetzt habe gemeinsam zum Hinzufügen / Entfernen / a Abfragezeichenfolgeflag Parameter aktualisieren. Nicht liefert einen Wert des Parameters entfernen, liefert ein fügt / aktualisieren, um die Paramter. Wenn keine URL angegeben wird, wird es von window.location ergriffen werden. Diese Lösung nimmt auch die Anker URL zu berücksichtigen.
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
Es wurde ein Fehler, wenn der erste Parameter in der Abfragezeichenfolgeflag entfernen, habe ich die Regex und Test nachgearbeitet ein Update enthalten.
UPDATE 2
@schellmax Update Situation zu beheben, wo Hashtag Symbol verloren geht, wenn eine Abfragezeichenfolgeflag Variable direkt vor einem Hashtag Entfernen
Sie können die URL ändern mit:
window.history.pushState({}, document.title, window.location.pathname);
Auf diese Weise können Sie die URL ohne die Suchparameter überschreiben, ich kann es verwenden, um die URL zu reinigen, nachdem die GET-Parameter übernehmen.
Angenommen, Sie key = val Parameter von URI entfernen möchten:
function removeParam(uri) {
return uri.replace(/([&\?]key=val*$|key=val&|[?&]key=val(?=#))/, '');
}
Hier ist, was ich verwende:
if (location.href.includes('?')) {
history.pushState({}, null, location.href.split('?')[0]);
}
Original URL: http://www.example.com/test/hello ? id = 123 & foo = bar
Ziel-URL: http://www.example.com/test/hello
Heres eine vollständige Funktion zum Hinzufügen und Parameter auf der Grundlage diese Frage und diesen Github Kern zu entfernen: 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 hinzu:
updateQueryStringParam( 'myparam', 'true' );
Und entfernen Sie es wie folgt aus:
updateQueryStringParam( 'myparam', null );
In diesem Thread sagten viele, dass der Regex ist wahrscheinlich nicht die beste / stabile Lösung ... so im nicht 100% sicher, ob das, was einige Fehler hat, aber so weit ich es getestet es funktioniert ziemlich gut.
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;
}
Mit jQuery:
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 sein, eine Bibliothek mit URI-Manipulation zu tun, wie es komplizierter ist, als es auf der Oberfläche, es selbst zu tun scheint. Schauen Sie sich auf: http://medialize.github.io/URI.js/
Von dem, was ich sehen kann, keine der oben genannten können normale Parameter und Array-Parameter verarbeiten. Hier ist eine, die funktioniert.
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 verwendet:
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
Natürlich einen Parameter zu aktualisieren, entfernen Sie einfach dann hinzuzufügen. Fühlen Sie sich frei eine Dummy-Funktion für sie zu machen.
alle Antworten auf diesen Thread haben einen Fehler, dass sie nicht beibehalten Anker / Fragment Teile von URLs.
Also, wenn Sie Ihre URL wie folgt aussieht:
http://dns-entry/path?parameter=value#fragment-text
und Sie ersetzen 'parameter'
werden Sie Ihr Fragment Text verlieren.
Hier finden Sie Anpassung der bisherigen Antworten (bobince über LukePH), das dieses Problem behebt:
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;
}
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, '');
}
Aufruf wie folgt
removeParam("http://google.com?q=123&q1=234&q2=567", "q1=234");
// returns http://google.com?q=123&q2=567
Dies gibt die URL w / o jede GET-Parameter:
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 entfernen Abfrageparameter mit der URL-Klasse für heute Browser:
function removeUrlParameter(url, paramKey)
{
var r = new URL(url);
r.searchParams.delete(paramKey);
return r.href;
}
URLSearchParams nicht auf alten Browsern unterstützt
https://caniuse.com/#feat=urlsearchparams
IE, Edge (unter 17) und Safari (unter 10.3) nicht unterstützen URLSearchParams innerhalb URL-Klasse.
Polyfills
URLSearchParams nur polyfill
https://github.com/WebReflection/url-search-params
Komplette Polyfill URL und URLSearchParams letzte WHATWG Spezifikationen entsprechen
Wenn Sie in jQuery sind, dann gibt es eine gute Query-String-Manipulation Plugin:
function removeQueryStringParameter(uri, key, value)
{
var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
var separator = uri.indexOf('?') !== -1 ? "&" : "?";
if (uri.match(re)) {
return uri.replace(re, '');
}
}