Obtenir le paramètre d'URL d'échappement

302

Je recherche un plugin jQuery qui peut obtenir des paramètres d'URL et prendre en charge cette chaîne de recherche sans générer l'erreur JavaScript: "séquence URI malformée". S'il n'y a pas de plugin jQuery qui le supporte, j'ai besoin de savoir comment le modifier pour le supporter.

?search=%E6%F8%E5

La valeur du paramètre URL, une fois décodée, doit être:

æøå

(les caractères sont norvégiens).

Je n'ai pas accès au serveur, donc je ne peux rien y changer.

Sindre Sorhus
la source
1
La raison pour laquelle vous obtenez une "séquence URI malformée" est que la majorité des fonctions utilisent decodeURIComponent(). Les caractères norvégiens étaient très probablement encodés en utilisant quelque chose comme escape()et changer l' decodeURIComponent()appel en unescape()devrait aider.
Kevin M
Voir ma réponse pour une solution moderne: stackoverflow.com/a/19992436/64949
Sindre Sorhus

Réponses:

418
function getURLParameter(name) {
    return decodeURI(
        (RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1]
    );
}
James
la source
33
Avec name = 'bar', je pense que cette expression régulière correspondrait 'foobar=10'et reviendrait '10'. Vous pourriez peut-être ajouter '[?|&]'au début de votre expression rationnelle. À votre santé!
Sébastien RoccaSerra
34
cette fonction retourne 'null' au lieu de null lorsque le paramètre n'est pas défini ... la joie de js ...
Damien
12
vous voudrez peut-être "decodeURIComponent ()" au lieu de "decodeURI ()", surtout si vous passez des données intéressantes comme les URL de retour en tant que paramètre d'URL
perfectionniste
25
C'est bien, mais decodeURIComponent est meilleur, par exemple j'avais un hashtag (% 23) dans mon param qui serait ignoré par decodeURI. Et je ne retournerais pas null, mais "", car decodeURI (null) === "null", qui est une valeur de retour bizarre, "" est mieux; vous pouvez faire if (! getURLParameter ("param")) au lieu de if (getURLParameter ("param") === "null"). Donc, ma version améliorée: decodeURIComponent ((RegExp (name + '=' + '(. +?) (& | $)'). Exec (location.search) || [, ""]) [1])
standup75
3
Down a voté car cela renvoie une chaîne, peu importe si le résultat a été trouvé ou non, et peu importe ce que vous mettez comme tableau alternatif, par exemple [, null], car le résultat a été encapsulé dans decodeURI qui a transformé quoi que ce soit en chaîne, Sanjeev avait raison mais son code n'a pas été testé correctement et le simple copier-coller ne fonctionne pas. function getURLParameter(name) { var p = RegExp(name + '=' + '(.+?)(&|$)').exec(location.search); if(!!p) { p = decodeURI(p[1]); } return p; }
Lukasz 'Severiaan' Grela
295

Vous trouverez ci-dessous ce que j'ai créé à partir des commentaires ici, ainsi que la correction de bugs non mentionnés (tels que le retour de null et non 'null'):

function getURLParameter(name) {
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}
radicand
la source
6
Que diriez-vous d'ajouter newdevant RegExp? Moins d'avertissements sur les peluches.
ripper234
18
Ce devrait être la réponse acceptée. Récupérer un vrai null au lieu de "null" est bien mieux.
Art
11
Si quelqu'un a besoin de cela converti en coffeescript: getURLParameter: (name) -> return decodeURIComponent ((new RegExp ("[? | &] # {Name} = ([^ &;] +?) (& | ## |; | | $) "). exec (location.search) || [null," "]) [1] .replace (/ \ + / g, '% 20')) || null;
Redbeard
1
@Redbeard - Votre fonction ne devrait-elle pas avoir un signe '=' après la définition de la méthode au lieu d'un double-point?
Zippie
1
Ceci est la seule version d'une fonction get-URL-parameter qui fonctionne pour moi avec une chaîne UTF8.
certainlyakey
107

Ce que vous voulez vraiment, c'est le plugin jQuery URL Parser . Avec ce plugin, obtenir la valeur d'un paramètre d'URL spécifique (pour l'URL actuelle) ressemble à ceci:

$.url().param('foo');

Si vous voulez un objet avec des noms de paramètres comme clés et des valeurs de paramètres comme valeurs, vous devez simplement appeler param()sans argument, comme ceci:

$.url().param();

Cette bibliothèque fonctionne également avec d'autres URL, pas seulement celle actuelle:

$.url('http://allmarkedup.com?sky=blue&grass=green').param();
$('#myElement').url().param(); // works with elements that have 'src', 'href' or 'action' attributes

Comme il s'agit d'une bibliothèque d'analyse d'URL complète, vous pouvez également obtenir d'autres informations à partir de l'URL, comme le port spécifié, ou le chemin d'accès, le protocole, etc.:

var url = $.url('http://allmarkedup.com/folder/dir/index.html?item=value');
url.attr('protocol'); // returns 'http'
url.attr('path'); // returns '/folder/dir/index.html'

Il a également d'autres fonctionnalités, consultez sa page d'accueil d' pour plus de documents et d'exemples.

Au lieu d'écrire votre propre analyseur d'URI dans ce but spécifique qui fonctionne un peu dans la plupart des cas, utilisez un analyseur d'URI réel. Selon la réponse, le code des autres réponses peut retourner 'null'au lieu de null, ne fonctionne pas avec des paramètres vides (?foo=&bar=x ), ne peut pas analyser et renvoyer tous les paramètres à la fois, répète le travail si vous interrogez plusieurs fois l'URL pour les paramètres, etc.

Utilisez un analyseur URI réel, n'inventez pas le vôtre.

Pour ceux qui sont opposés à jQuery, il existe une version du plugin qui est purement JS .

Lucas
la source
23
La question est "obtenir le paramètre URL avec jQuery". Ma réponse répond à la question. D'autres réponses demandent à l'utilisateur d'écrire essentiellement son propre analyseur d'URI pour ce cas d'utilisation spécifique, ce qui est une idée terrible. L'analyse des URI est plus compliquée que les gens le pensent.
Lucas
2
C'est la réponse que je cherchais, et c'est très jQuery-ish, contrairement à certaines des autres réponses.
Ehtesh Choudhury
Le plugin gère-t-il l'encodage URI ou dois-je le décoder manuellement?
Roberto Linares
La question dit "javascript" (je pense que cela signifie directement le DOM) ou jQuery. Donc, tous les autres feront l'affaire.
brunoais
43

Si vous ne savez pas quels seront les paramètres d'URL et que vous souhaitez obtenir un objet avec les clés et les valeurs qui se trouvent dans les paramètres, vous pouvez utiliser ceci:

function getParameters() {
  var searchString = window.location.search.substring(1),
      params = searchString.split("&"),
      hash = {};

  if (searchString == "") return {};
  for (var i = 0; i < params.length; i++) {
    var val = params[i].split("=");
    hash[unescape(val[0])] = unescape(val[1]);
  }
  return hash;
}

L'appel de getParameters () avec une URL comme /posts?date=9/10/11&author=nilbusretournerait:

{
  date:   '9/10/11',
  author: 'nilbus'
}

Je n'inclurai pas le code ici car il est encore plus éloigné de la question, mais weareon.net a publié une bibliothèque qui permet également la manipulation des paramètres dans l'URL:

Edward Anderson
la source
1
Oui, il vaut mieux obtenir tous les paramètres. Toutes les autres solutions répertoriées ici répètent l'expression régulière pour chaque paramètre.
Bernard
Cette fonction renvoie un objet maladroit: {"": undefined}lorsque l'URL est vide de paramètres. Il est préférable de renvoyer un objet vide en utilisant if(searchString=='') return {};directement après l' searchStringaffectation.
Jordan Arseno
40

Vous pouvez utiliser la propriété native location.search du navigateur :

function getParameter(paramName) {
  var searchString = window.location.search.substring(1),
      i, val, params = searchString.split("&");

  for (i=0;i<params.length;i++) {
    val = params[i].split("=");
    if (val[0] == paramName) {
      return unescape(val[1]);
    }
  }
  return null;
}

Mais il existe des plugins jQuery qui peuvent vous aider:

CMS
la source
4
Ceci est beaucoup plus propre et plus lisible (et probablement plus exempt de bogues) que tous ces monolignes regex.
Timmmm
8
Je proposerai d'utiliser decodeURIComponent () au lieu d'unescape ()
freedev
+1 cela fonctionne pour les navigateurs modernes mais certains développeurs doivent travailler avec ...: | IE8: S.
brunoais
25

Basé sur la réponse du 999 :

function getURLParameter(name) {
    return decodeURIComponent(
        (location.search.match(RegExp("[?|&]"+name+'=(.+?)(&|$)'))||[,null])[1]
    );  
}

Changements:

  • decodeURI() est remplacé par decodeURIComponent()
  • [?|&] est ajouté au début de l'expression rationnelle
Eugene Yarmash
la source
3
Cela pourrait être utile aux autres si vous pouviez expliquer pourquoi vous avez apporté ces modifications. Thx
Timm
3
Ne pas manipuler params vides: ?a=&b=1. Une meilleure expression rationnelle serait:"[?&]"+name+"=([^&]*)"
serg
6

Besoin d'ajouter le paramètre i pour le rendre insensible à la casse:

  function getURLParameter(name) {
    return decodeURIComponent(
      (RegExp(name + '=' + '(.+?)(&|$)', 'i').exec(location.search) || [, ""])[1]
    );
  }
Scott Wojan
la source
3

Après avoir lu toutes les réponses, je me suis retrouvé avec cette version avec + une deuxième fonction pour utiliser les paramètres comme drapeaux

function getURLParameter(name) {
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)','i').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}

function isSetURLParameter(name) {
    return (new RegExp('[?|&]' + name + '(?:[=|&|#|;|]|$)','i').exec(location.search) !== null)
}
Néon
la source
2
Bonne réponse, un seul avertissement cependant. Selon JSHint, [, ""] peut entraîner des problèmes pour les anciens navigateurs. Donc, utilisez plutôt [null, ""] ou [undefined, ""]. Il y a encore quelques-uns d'entre nous malheureux qui soutiennent IE8 et osent le dire IE7.
Delicia Brummitt
2
$.urlParam = function(name){
  var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(top.window.location.href); 
  return (results !== null) ? results[1] : 0;
}

$.urlParam("key");
Yoshi
la source
2

Par exemple, une fonction qui renvoie la valeur d'une variable de paramètres.

function GetURLParameter(sParam)
{
    var sPageURL = window.location.search.substring(1);
    var sURLVariables = sPageURL.split('&');
    for (var i = 0; i < sURLVariables.length; i++)
    {
        var sParameterName = sURLVariables[i].split('=');
        if (sParameterName[0] == sParam)
        {
            return sParameterName[1];
        }
    }
}​

Et voici comment vous pouvez utiliser cette fonction en supposant que l'URL est,

"http://example.com/?technology=jquery&blog=jquerybyexample".

var tech = GetURLParameter('technology');
var blog = GetURLParameter('blog');

Ainsi, dans la variable de code ci-dessus, "tech" aura "jQuery" comme valeur et la variable "blog" sera "jquerybyexample".

Rubyist
la source
2

Vous ne devez pas utiliser jQuery pour quelque chose comme ça!
La méthode moderne consiste à utiliser de petits modules réutilisables via un gestionnaire de packages comme Bower.

J'ai créé un petit module qui peut analyser la chaîne de requête dans un objet. Utilisez-le comme ceci:

// parse the query string into an object and get the property
queryString.parse(unescape(location.search)).search;
//=> æøå
Sindre Sorhus
la source
Si vous dites que ce n'est pas moderne d'avoir un cadre, c'est bien. Mais à mon avis, les cadres ont vraiment leur place. jQuery me semble de moins en moins jolie.
Lodewijk
0

Il y a beaucoup de code bogué ici et les solutions d'expression régulière sont très lentes. J'ai trouvé une solution qui fonctionne jusqu'à 20 fois plus vite que l'homologue regex et est d'une simplicité élégante:

    /*
    *   @param      string      parameter to return the value of.
    *   @return     string      value of chosen parameter, if found.
    */
    function get_param(return_this)
    {
        return_this = return_this.replace(/\?/ig, "").replace(/=/ig, ""); // Globally replace illegal chars.

        var url = window.location.href;                                   // Get the URL.
        var parameters = url.substring(url.indexOf("?") + 1).split("&");  // Split by "param=value".
        var params = [];                                                  // Array to store individual values.

        for(var i = 0; i < parameters.length; i++)
            if(parameters[i].search(return_this + "=") != -1)
                return parameters[i].substring(parameters[i].indexOf("=") + 1).split("+");

        return "Parameter not found";
    }

console.log(get_param("parameterName"));

Regex n'est pas la solution globale, pour ce type de problème, la manipulation simple des chaînes peut fonctionner énormément plus efficacement. Source de code .

George Anthony
la source
0
<script type="text/javascript">
function getURLParameter(name) {
        return decodeURIComponent(
            (location.search.toLowerCase().match(RegExp("[?|&]" + name + '=(.+?)(&|$)')) || [, null])[1]
        );
    }

</script>

getURLParameter(id)ou getURLParameter(Id)Fonctionne de la même manière:)

user2310887
la source
0

Extrait de code jQuery pour obtenir les variables dynamiques stockées dans l'URL en tant que paramètres et les stocker en tant que variables JavaScript prêtes à être utilisées avec vos scripts:

$.urlParam = function(name){
    var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
    if (results==null){
       return null;
    }
    else{
       return results[1] || 0;
    }
}

example.com?param1=name&param2=&id=6

$.urlParam('param1'); // name
$.urlParam('id');        // 6
$.urlParam('param2');   // null

//example params with spaces
http://www.jquery4u.com?city=Gold Coast
console.log($.urlParam('city'));  
//output: Gold%20Coast

console.log(decodeURIComponent($.urlParam('city'))); 
//output: Gold Coast
Reza Baradaran Gazorisangi
la source
-1
function getURLParameters(paramName) 
{
        var sURL = window.document.URL.toString();  
    if (sURL.indexOf("?") > 0)
    {
       var arrParams = sURL.split("?");         
       var arrURLParams = arrParams[1].split("&");      
       var arrParamNames = new Array(arrURLParams.length);
       var arrParamValues = new Array(arrURLParams.length);     
       var i = 0;
       for (i=0;i<arrURLParams.length;i++)
       {
        var sParam =  arrURLParams[i].split("=");
        arrParamNames[i] = sParam[0];
        if (sParam[1] != "")
            arrParamValues[i] = unescape(sParam[1]);
        else
            arrParamValues[i] = "No Value";
       }

       for (i=0;i<arrURLParams.length;i++)
       {
                if(arrParamNames[i] == paramName){
            //alert("Param:"+arrParamValues[i]);
                return arrParamValues[i];
             }
       }
       return "No Parameters Found";
    }

}
Dhiral Pandya
la source
-1

J'ai créé une fonction simple pour obtenir le paramètre URL en JavaScript à partir d'une URL comme celle-ci:

.....58e/web/viewer.html?page=*17*&getinfo=33


function buildLinkb(param) {
    var val = document.URL;
    var url = val.substr(val.indexOf(param))  
    var n=parseInt(url.replace(param+"=",""));
    alert(n+1); 
}
buildLinkb("page");

PRODUCTION: 18

Code Spy
la source
2
Soyez prudent lorsque vous publiez des réponses copier-coller passe-partout / verbatim à plusieurs questions, celles-ci ont tendance à être signalées comme "spam" par la communauté. Si vous faites cela, cela signifie généralement que les questions sont des doublons, signalez-les plutôt comme telles: stackoverflow.com/a/11808489/419
Kev
-1

Juste au cas où vous auriez l'URL comme localhost / index.xsp? A = 1 # quelque chose et que vous devez obtenir le param pas le hachage.

var vars = [], hash, anchor;
var q = document.URL.split('?')[1];
if(q != undefined){
    q = q.split('&');
    for(var i = 0; i < q.length; i++){
        hash = q[i].split('=');
        anchor = hash[1].split('#');
        vars.push(anchor[0]);
        vars[hash[0]] = anchor[0];
    }
}
Ancyent
la source
-1

Légère modification de la réponse de @pauloppenheim, car elle ne traitera pas correctement les noms de paramètres qui peuvent faire partie d'autres noms de paramètres.

Par exemple: si vous avez des paramètres "appenv" et "env", la nouvelle valeur de "env" peut récupérer la valeur "appenv".

Réparer:

var urlParamVal = function (name) {
    var result = RegExp("(&|\\?)" + name + "=(.+?)(&|$)").exec(location.search);
    return result ? decodeURIComponent(result[2]) : "";
};
lasantha
la source
-2

Cela peut aider.

<script type="text/javascript">
    $(document).ready(function(){
        alert(getParameterByName("third"));
    });
    function getParameterByName(name){
        var url     = document.URL,
            count   = url.indexOf(name);
            sub     = url.substring(count);
            amper   = sub.indexOf("&"); 

        if(amper == "-1"){
            var param = sub.split("=");
            return param[1];
        }else{
            var param = sub.substr(0,amper).split("=");
            return param[1];
        }

    }
</script>
Ram Guiao
la source
1
Ce code n'est pas bien testé. Devinez ce qui se passe avec la requête?twothrids=text
Lyth