414 votes

Analyse de la chaîne de requête en JavaScript

Je dois analyser la chaîne de requête www.mysite.com/default.aspx?dest=aboutus.aspx . Comment obtenir le dest en JavaScript ?

0 votes

Jetez un coup d'œil à cette solution . En utilisant cette fonction, il suffirait de ne pas appeler gup('dest') pour récupérer l'URL dest paramètre.

0 votes

Function qs(search_for) { var query = window.location.search.substring(1) ; var parms = query.split('&') ; for (var i = 0 ; i < parms.length ; i++) { var pos = parms[i].indexOf('=') ; if (pos > 0 && search_for == parms[i].substring(0, pos)) { return parms[i].substring(pos + 1) ; } } return "" ; } //utilisation : document.write(qs("isFolderLevel")) ;

0 votes

394voto

Tarik Points 16118

Voici une méthode simple et rapide pour analyser les chaînes de requête en JavaScript :

function getQueryVariable(variable) {
    var query = window.location.search.substring(1);
    var vars = query.split('&');
    for (var i = 0; i < vars.length; i++) {
        var pair = vars[i].split('=');
        if (decodeURIComponent(pair[0]) == variable) {
            return decodeURIComponent(pair[1]);
        }
    }
    console.log('Query variable %s not found', variable);
}

Demandez maintenant à page.html?x=Hello :

console.log(getQueryVariable('x'));

11 votes

Vous devez également décoder tous les caractères spéciaux qui ont été encodés en pourcentage

46 votes

Facile, mais pas très rapide si vous avez besoin d'obtenir plus d'une valeur de requête. Je pense qu'une meilleure abstraction est de retourner un objet JS avec toutes les paires nom-valeur de la chaîne de requête

11 votes

De même, le split("=") n'est pas suffisant, vous pouvez avoir une paire "nom=valeur" où la valeur contient un '=' non encodé. La solution est de faire un indexOf('=') pour trouver le premier '=', et la sous-chaîne avant et après.

202voto

function parseQuery(queryString) {
    var query = {};
    var pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');
    for (var i = 0; i < pairs.length; i++) {
        var pair = pairs[i].split('=');
        query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');
    }
    return query;
}

Transforme une chaîne de requête comme hello=1&another=2 en objet {hello: 1, another: 2} . À partir de là, il est facile d'extraire la variable dont vous avez besoin.

Cela dit, il ne traite pas des cas de tableaux tels que "hello=1&hello=2&hello=3" . Pour travailler avec cela, vous devez vérifier si une propriété de l'objet que vous créez existe avant de l'ajouter, et transformer la valeur de cette propriété en un tableau, en y ajoutant d'éventuels bits supplémentaires.

0 votes

Si b est un tableau d'un seul élément, cette fonction échouera. ex. somesite.com/?varrible1=data&varrible2= ex. somesite.com/?varrible1=data&varrible

2 votes

Voici les tests Jasmine pour cela : gist.github.com/amyboyd/68a86fe3f65a77fcfc7f

0 votes

for (var i in a) échoue car il pourrait énumérer des noms d'objets en plus des valeurs d'index de tableau.

56voto

SalmanPK Points 6649

Vous pouvez également utiliser l'excellent URI.js bibliothèque de Rodney Rehm . Voici comment :-

var qs = URI('www.mysite.com/default.aspx?dest=aboutus.aspx').query(true); // == { dest : 'aboutus.aspx' }
    alert(qs.dest); // == aboutus.aspx

Et pour analyser la chaîne de requête de la page actuelle:-

var $_GET = URI(document.URL).query(true); // ala PHP
    alert($_GET['dest']); // == aboutus.aspx

0 votes

Que fait l'argument dans la partie .query(true) ? S'agit-il de renvoyer la requête sous la forme d'un objet clé-valeur au lieu de la chaîne de caractères de la requête ?

0 votes

@bigp Yup .query() renvoie la chaîne de requête dans foo=bar&hello=world format alors que .query(true) analyse la chaîne de requête en un objet, par exemple, { foo : 'bar', hello : 'world' } .

9 votes

Cool, mais les solutions nécessitant des bibliothèques tierces ne sont pas idéales. Je suis quelque peu surpris que cette solution ait reçu autant de votes positifs. Sans vouloir offenser @SalmanPK

26voto

drzaus Points 3344

Moi aussi ! http://jsfiddle.net/drzaus/8EE8k/

(Note : sans vérification fantaisiste de l'imbrication ou du dédoublement)

deparam = (function(d,x,params,p,i,j) {
return function (qs) {
    // start bucket; can't cheat by setting it in scope declaration or it overwrites
    params = {};
    // remove preceding non-querystring, correct spaces, and split
    qs = qs.substring(qs.indexOf('?')+1).replace(x,' ').split('&');
    // march and parse
    for (i = qs.length; i > 0;) {
        p = qs[--i];
        // allow equals in value
        j = p.indexOf('=');
        // what if no val?
        if(j === -1) params[d(p)] = undefined;
        else params[d(p.substring(0,j))] = d(p.substring(j+1));
    }

    return params;
};//--  fn  deparam
})(decodeURIComponent, /\+/g);

Et des tests :

var tests = {};
tests["simple params"] = "ID=2&first=1&second=b";
tests["full url"] = "http://blah.com/?third=c&fourth=d&fifth=e";
tests['just ?'] = '?animal=bear&fruit=apple&building=Empire State Building&spaces=these+are+pluses';
tests['with equals'] = 'foo=bar&baz=quux&equals=with=extra=equals&grault=garply';
tests['no value'] = 'foo=bar&baz=&qux=quux';
tests['value omit'] = 'foo=bar&baz&qux=quux';

var $output = document.getElementById('output');
function output(msg) {
    msg = Array.prototype.slice.call(arguments, 0).join("\n");
    if($output) $output.innerHTML += "\n" + msg + "\n";
    else console.log(msg);
}
var results = {}; // save results, so we can confirm we're not incorrectly referencing
$.each(tests, function(msg, test) {
    var q = deparam(test);
    results[msg] = q;
    output(msg, test, JSON.stringify(q), $.param(q));
    output('-------------------');
});

output('=== confirming results non-overwrite ===');
$.each(results, function(msg, result) {
    output(msg, JSON.stringify(result));
    output('-------------------');
});

Résultats en :

simple params
ID=2&first=1&second=b
{"second":"b","first":"1","ID":"2"}
second=b&first=1&ID=2
-------------------
full url
http://blah.com/?third=c&fourth=d&fifth=e
{"fifth":"e","fourth":"d","third":"c"}
fifth=e&fourth=d&third=c
-------------------
just ?
?animal=bear&fruit=apple&building=Empire State Building&spaces=these+are+pluses
{"spaces":"these are pluses","building":"Empire State Building","fruit":"apple","animal":"bear"}
spaces=these%20are%20pluses&building=Empire%20State%20Building&fruit=apple&animal=bear
-------------------
with equals
foo=bar&baz=quux&equals=with=extra=equals&grault=garply
{"grault":"garply","equals":"with=extra=equals","baz":"quux","foo":"bar"}
grault=garply&equals=with%3Dextra%3Dequals&baz=quux&foo=bar
-------------------
no value
foo=bar&baz=&qux=quux
{"qux":"quux","baz":"","foo":"bar"}
qux=quux&baz=&foo=bar
-------------------
value omit
foo=bar&baz&qux=quux
{"qux":"quux","foo":"bar"}   <-- it's there, i swear!
qux=quux&baz=&foo=bar        <-- ...see, jQuery found it
-------------------

0 votes

J'essaie de rester simple

0 votes

Que se passe-t-il si l'une des variables de la chaîne de requête contient le signe = (égal) ?

0 votes

@WebolizeR -- compte tenu de la valeur contenant = aurait dû être encodé, il ne devrait pas y avoir de problème jsfiddle.net/8EE8k/15

18voto

Henry Rusted Points 119

Voici ma version, basée sur la version de Braceyard ci-dessus, mais avec l'analyse dans un "dictionnaire" et la prise en charge des arguments de recherche sans "=". Je l'utilise dans ma fonction JQuery $(document).ready(). Les arguments sont stockés sous forme de paires clé/valeur dans argsParsed, que vous voudrez peut-être sauvegarder quelque part...

'use strict';

function parseQuery(search) {

    var args = search.substring(1).split('&');

    var argsParsed = {};

    var i, arg, kvp, key, value;

    for (i=0; i < args.length; i++) {

        arg = args[i];

        if (-1 === arg.indexOf('=')) {

            argsParsed[decodeURIComponent(arg).trim()] = true;
        }
        else {

            kvp = arg.split('=');

            key = decodeURIComponent(kvp[0]).trim();

            value = decodeURIComponent(kvp[1]).trim();

            argsParsed[key] = value;
        }
    }

    return argsParsed;
}

parseQuery(document.location.search);

2 votes

Y a-t-il une raison d'utiliser unescape() au lieu de decodeURI() ?

1 votes

J'ajouterais if(args[i].length){ comme première ligne de la boucle afin d'éviter les clés vides dans argsParsed.

1 votes

@ghigo Oui, vérifier la présence d'une clé de longueur nulle serait une bonne idée, peut-être après l'élagage. Il n'y avait aucune raison d'utiliser unescape(), je ne me souviens plus d'où je l'ai copié ;-)

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