Comment puis-je supprimer un paramètre de chaîne de requête en JavaScript?
Est-il une meilleure façon de supprimer un paramètre à partir d'une chaîne de requête dans une chaîne d'URL en JavaScript standard autres que par l'utilisation d'une expression régulière?
Voici ce que j'ai trouvé jusqu'à présent qui semble fonctionner dans mes tests, mais je n'aime pas à réinventer querystring analyse!
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;
}
Vous devez vous connecter pour publier un commentaire.
Semble dangereuse car elle le paramètre ‘bar’ correspondent à:
Aussi, il ne pourrait pas s'
parameter
contenait des caractères spéciaux dans les RegExp, tels que ‘.’. Et c'est pas un regex, donc il ne serait que de supprimer une instance de l'paramètre.Je ne voudrais pas utiliser un simple RegExp pour cela, j'aimerais analyser les paramètres et de perdre ceux que vous ne voulez pas.
split
toujours divise globalement, vous n'avez pas à définir explicitementg
. Vraiment dommage, en tant que mono-split fonctionnalité aurait été utile. (split(..., 1)
fait quelque chose d'inutile à la place.)url= urlparts[0]+'?'+pars.join('&');
àurl= urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : "");
pars[i].lastIndexOf(prefix, 0)
devenirpars[i].toLowerCase().lastIndexOf(prefix.toLowerCase(), 0)
[]
à la fin du nom, alors il suffit d'inclure[]
à la fin du nom. JavaScript et le web en général ne sait rien de spécial à propos de paramètres avec[]
à la fin, c'est seulement en PHP qui utilise (cassé) est-baie-drapeau.Copié à partir de bobince réponse, mais le fait de soutenir un point d'interrogation dans la chaîne de requête, par exemple
http://www.google.com/search?q=test???+quelque chose&aq=f
Est-il valable d'avoir plus d'un point d'interrogation dans l'URL?
???
est de syntaxe non valide et ne devrait jamais se produire dans une URL".return url.endsWith("?") ? url.slice(0,-1) : url;
pour couvrir le cas où le paramètre à supprimer est le seul dans la chaîne de requêteLes navigateurs modernes fournir
URLSearchParams
interface de travailler avec la recherche params. Qui asupprimer
méthode qui supprime les param par son nom.JS:
URLSearchParams
n'est pas pris en charge par IE, Edge 16 et iOS 10.2 Safari. (réf: caniuse.com/#feat=urlsearchparams)Je ne vois pas de problèmes majeurs avec une regex solution. Mais, n'oubliez pas de préserver l'identificateur de fragment (texte après le
#
).Voici ma solution:
Et à bobince point, oui - vous avez besoin pour échapper à
.
caractères dans les noms de paramètres.url.replace(new RegExp('^([^#]*\?)(([^#]*)&)?' + parameter + '(\=[^&#]*)?(&|#|$)' ), '$1$3$5').replace(/^([^#]*)((\?)&|\?(#|$))/,'$1$3$4')
Toute personne intéressée à une regex solution j'ai mis en place cette fonction pour ajouter/supprimer/mettre à jour un paramètre de chaîne de requête. Ne pas fournir une valeur de supprimer le paramètre, en fournissant l'on va ajouter/mettre à jour le paramètre. Si aucune URL est fourni, il sera saisi de la fenêtre.emplacement. Cette solution prend également l'url de l'ancre en considération.
Mise à JOUR
Il y avait un bug lors de la suppression du premier paramètre dans la chaîne de requête, j'ai retravaillé les regex et test d'inclure un correctif.
Mise à JOUR 2
@schellmax mise à jour pour corriger la situation où hashtag symbole est perdu lors de la suppression d'une variable querystring directement avant un hashtag
UpdateQueryString('a', null, 'http://www.test.com?a=b#c');
url
pour chaque remplacement de l'itération. Mais, cela signifie que vous devez entrer unvalue
dans les arguments, qui va quitter la chaîne de requête de la moitié enlevé. Pour contrer cela, utiliserundefined
ounull
pourvalue
argument comme:url_from_last_iteration = UpdateQueryString(current_ignore_key, undefined/null, url_from_last_iteration);
En supposant que vous souhaitez supprimer de la clé=valeur de paramètre à partir de l'URI:
/([&?]key=val*$|key=val&|[?&]key=val(?=#))/
peut être préférable lors de l'utilisation d'un linter comme eslintVous pouvez modifier l'URL avec:
de cette façon, vous pouvez remplacer l'URL sans le paramètre de recherche, je l'utilise pour nettoyer l'URL après les paramètres GET.
Voici ce que j'utilise:
URL d'origine: http://www.example.com/test/hello?id=123&foo=bar
L'URL de Destination: http://www.example.com/test/hello
Heres une fonction complète pour l'ajout et la suppression des paramètres basés sur cette question et cette github gist:
https://gist.github.com/excalq/2961415
Vous pouvez ajouter des paramètres comme ceci:
Et l'enlever comme ceci:
Dans ce fil de nombreux dit que la regex est probablement pas le meilleur/solution stable ... donc je ne suis pas sûr à 100%, si cette chose a des défauts, mais aussi loin que je l'ai testé il fonctionne très bien.
La version ci-dessus en fonction
À l'aide de jQuery:
Vous devriez être en utilisant une bibliothèque à faire URI manipulation que c'est plus compliqué qu'il n'y paraît sur la surface de le faire vous-même. Jetez un oeil à: http://medialize.github.io/URI.js/
De ce que je peux voir, aucun de ce qui précède peut gérer les paramètres normaux et les paramètres de tableau. En voici une qui ne.
Comment l'utiliser:
Bien sûr, à mettre à jour un paramètre, il suffit de retirer les ajouter. N'hésitez pas à faire un mannequin de la fonction pour cela.
path.replace(new RegExp("&?"+param+"=[\\w]+", "g"), "");
Je voudrais changer les regex pour[\\w]*
à inclure des paramètres comme "param=" sans valeurs.Toutes les réponses sur ce fil ont une faille qu'ils ne permettent pas de préserver l'ancre, fragment parties de l'Url.
Donc, si votre URL est:
et vous le remplacez 'paramètre'
vous perdrez votre fragment de texte.
Ce qui suit est une adaptation de la réponse à la question précédente (bobince via LukePH), qui traite de ce problème:
url = urlBase+'?'+pars.join('&');
àurl = urlBase + (pars.length > 0 ? '?' + pars.join('&') : "");
Une version modifiée de la solution par ssh_imov
Appeler comme ça
Cela retourne l'URL w/o les Paramètres:
C'est une version propre supprimer le paramètre de requête avec le URL classe pour aujourd'hui navigateurs:
URLSearchParams pas pris en charge sur les vieux navigateurs
https://caniuse.com/#feat=urlsearchparams
C'est à dire, Bord (en-dessous de 17) et Safari (10.3 ci-dessous) ne prennent pas en charge URLSearchParams à l'intérieur de l'URL de la classe.
Polyfills
URLSearchParams seulement polyfill
https://github.com/WebReflection/url-search-params
Complète Polyfill URL et URLSearchParams pour correspondre à la dernière WHATWG spécifications
https://github.com/lifaon74/url-polyfill
Si vous êtes en jQuery, il y a une bonne chaîne de requête de manipulation de plugin: