193 votes

Comment puis-je supprimer un paramètre de chaîne de requête en JavaScript?

Existe-t-il un meilleur moyen de supprimer un paramètre d'une chaîne de requête dans une chaîne d'URL en JavaScript standard autrement qu'en utilisant une expression régulière?

Voici ce que j'ai trouvé jusqu'ici qui semble fonctionner dans mes tests, mais je n'aime pas réinventer l'analyse de chaîne de requête!

 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;
}
 

202voto

bobince Points 270740
 "[&;]?" + parameter + "=[^&;]+"
 

Cela semble dangereux car le paramètre 'bar' correspondrait à:

 ?a=b&foobar=c
 

En outre, cela échouerait si parameter contenait des caractères spéciaux dans RegExp, tels que '.'. Et comme ce n'est pas une expression rationnelle globale, cela ne supprimerait qu'une instance du paramètre.

Je ne voudrais pas utiliser un simple RegExp pour cela, je voudrais analyser les paramètres et perdre ceux que vous ne voulez pas.

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

        url= urlparts[0]+'?'+pars.join('&');
        return url;
    } else {
        return url;
    }
}
 

28voto

Jared Points 41

Je ne vois pas de problèmes majeurs avec une solution regex. Mais n'oubliez pas de conserver l'identifiant du fragment (texte après le '#'). Voici ma solution:

 function RemoveParameterFromUrl(url, parameter) {
  return url
    .replace(new RegExp('[?&]' + parameter + '=[^&#]*(#.*)?$'), '$1')
    .replace(new RegExp('([?&])' + parameter + '=[^&]*&'), '$1');
}
 

Et pour en venir au fait, oui, il faudrait que vous vous échappiez. caractères dans les noms de paramètres.

23voto

LukePH Points 305

Copié à partir de la réponse bobince, mais le faisant supporter les points d'interrogation dans la chaîne de requête, par exemple

http://www.google.com/search?q=test????+something&aq=f

Est-il valide d'avoir plus d'un point d'interrogation dans une URL?

 function removeParameter(url, parameter)
{
  var urlparts= url.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.join('&');
  }
  return url;
}
 

12voto

ellemayo Points 1687

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.

function UpdateQueryString(key, value, url) {
    if (!url) url = window.location.href;
    var re = new RegExp("([?&])" + key + "=.*?(&|#|$)(.*)", "gi");

    if (re.test(url)) {
        if (typeof value !== 'undefined' && value !== null)
            return url.replace(re, '$1' + key + "=" + value + '$2$3');
        else {
            var 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;
    }
}

Mise à JOUR

Il y a eu 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

3voto

Graham Points 1

La version ci-dessus en fonction

 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;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X