javascript - querystring - query string parse




Wie kann ich Abfragezeichenfolgenwerte in JavaScript erhalten? (20)

ES2015 (ES6)

getQueryStringParams = query => {
    return query
        ? (/^[?#]/.test(query) ? query.slice(1) : query)
            .split('&')
            .reduce((params, param) => {
                    let [key, value] = param.split('=');
                    params[key] = value ? decodeURIComponent(value.replace(/\+/g, ' ')) : '';
                    return params;
                }, {}
            )
        : {}
};

Ohne jQuery

var qs = (function(a) {
    if (a == "") return {};
    var b = {};
    for (var i = 0; i < a.length; ++i)
    {
        var p=a[i].split('=', 2);
        if (p.length == 1)
            b[p[0]] = "";
        else
            b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
    }
    return b;
})(window.location.search.substr(1).split('&'));

Bei einer URL wie ?topic=123&name=query+string wird Folgendes zurückgegeben:

qs["topic"];    // 123
qs["name"];     // query string
qs["nothere"];  // undefined (object)

Google-Methode

Google-Code getUrlParameters Ich fand die Methode, die sie verwenden: getUrlParameters

function (b) {
    var c = typeof b === "undefined";
    if (a !== h && c) return a;
    for (var d = {}, b = b || k[B][vb], e = b[p]("?"), f = b[p]("#"), b = (f === -1 ? b[Ya](e + 1) : [b[Ya](e + 1, f - e - 1), "&", b[Ya](f + 1)][K](""))[z]("&"), e = i.dd ? ia : unescape, f = 0, g = b[w]; f < g; ++f) {
        var l = b[f][p]("=");
        if (l !== -1) {
            var q = b[f][I](0, l),
                l = b[f][I](l + 1),
                l = l[Ca](/\+/g, " ");
            try {
                d[q] = e(l)
            } catch (A) {}
        }
    }
    c && (a = d);
    return d
}

Es ist verschleiert, aber es ist verständlich. Es funktioniert nicht, weil einige Variablen undefiniert sind.

Sie beginnen nach Parametern auf der URL von ? und auch aus dem Hash # . Dann teilen sie sich für jeden Parameter das Gleichheitszeichen b[f][p]("=") (was wie indexOf aussieht, verwenden sie die Position des indexOf , um den Schlüssel / Wert zu erhalten). Bei der Aufteilung wird geprüft, ob der Parameter einen Wert hat oder nicht. Wenn dies der Fall ist, wird der Wert von d gespeichert, andernfalls wird einfach fortgefahren.

Am Ende wird das Objekt d zurückgegeben, das Escapezeichen und das Pluszeichen behandelt. Dieses Objekt ist genau wie ich, es hat das gleiche Verhalten.

Meine Methode als jQuery-Plugin

(function($) {
    $.QueryString = (function(paramsArray) {
        let params = {};

        for (let i = 0; i < paramsArray.length; ++i)
        {
            let param = paramsArray[i]
                .split('=', 2);

            if (param.length !== 2)
                continue;

            params[param[0]] = decodeURIComponent(param[1].replace(/\+/g, " "));
        }

        return params;
    })(window.location.search.substr(1).split('&'))
})(jQuery);

Verwendungszweck

//Get a param
$.QueryString.param
//-or-
$.QueryString["param"]
//This outputs something like...
//"val"

//Get all params as object
$.QueryString
//This outputs something like...
//Object { param: "val", param2: "val" }

//Set a param (only in the $.QueryString object, doesn't affect the browser's querystring)
$.QueryString.param = "newvalue"
//This doesn't output anything, it just updates the $.QueryString object

//Convert object into string suitable for url a querystring (Requires jQuery)
$.param($.QueryString)
//This outputs something like...
//"param=newvalue&param2=val"

//Update the url/querystring in the browser's location bar with the $.QueryString object
history.replaceState({}, '', "?" + $.param($.QueryString));
//-or-
history.pushState({}, '', "?" + $.param($.QueryString));

Leistungstest (Split-Methode gegen Regex-Methode) ( jsPerf )

Vorbereitungscode: Methodendeklaration

Geteilter Testcode

var qs = window.GetQueryString(query);

var search = qs["q"];
var value = qs["value"];
var undef = qs["undefinedstring"];

Regex-Testcode

var search = window.getParameterByName("q");
var value = window.getParameterByName("value");
var undef = window.getParameterByName("undefinedstring");

Testen in Firefox 4.0 x86 unter Windows Server 2008 R2 / 7 x64

  • Split-Methode : 144.780 ± 2,17% am schnellsten
  • Regex-Methode : 13,891 ± 0,85% | 90% langsamer

Gibt es eine Plugin-lose Möglichkeit, Abfrage-String- Werte über jQuery (oder ohne) abzurufen?

Wenn das so ist, wie? Wenn nicht, gibt es ein Plugin, das dies tun kann?


URLSearchParams

Firefox 44+, Opera 36+, Edge 17+, Safari 10.3+ und Chrome 49+ unterstützen die URLSearchParams- API:

Es gibt einen von Google vorgeschlagenen URLSearchParams-Polyfill für die stabilen Versionen von IE.

Es ist nicht von W3C standardisiert, aber es ist ein Lebensstandard von WhatWG .

Sie können es vor Ort verwenden, aber Sie müssen das entfernen ? Fragezeichen (zB mit .slice(1) ):

let params = new URLSearchParams(location.search);

oder

let params = (new URL(location)).searchParams;

Oder natürlich unter einer beliebigen URL:

let url = new URL('https://example.com?foo=1&bar=2');
let params = new URLSearchParams(url.search);

Sie können Parameter auch mit der Abkürzung .searchParams Eigenschaft für das URL-Objekt erhalten, z.

let params = new URL('https://example.com?foo=1&bar=2').searchParams;
params.get('foo'); // "1"
params.get('bar'); // "2" 

Sie lesen / setzen Parameter über die API get(KEY) , set(KEY, VALUE) , append(KEY, VALUE) . Sie können auch alle Werte for (let p of params) {} .

Für die Prüfung und Prüfung stehen eine Referenzimplementierung und eine Musterseite zur Verfügung.


Dies sind alles großartige Antworten, aber ich brauchte etwas robusteres und dachte, Sie alle könnten das haben, was ich geschaffen habe.

Es ist eine einfache Bibliotheksmethode, die URL-Parameter zerlegt und bearbeitet. Die statische Methode verfügt über die folgenden Untermethoden, die für die betreffende URL aufgerufen werden können:

  • GetHost
  • getPath
  • GetHash
  • setHash
  • getParams
  • getQuery
  • setParam
  • getParam
  • hasParam
  • removeParam

Beispiel:

URLParser(url).getParam('myparam1')
var url = "http://www.test.com/folder/mypage.html?myparam1=1&myparam2=2#something";

function URLParser(u){
    var path="",query="",hash="",params;
    if(u.indexOf("#") > 0){
        hash = u.substr(u.indexOf("#") + 1);
        u = u.substr(0 , u.indexOf("#"));
    }
    if(u.indexOf("?") > 0){
        path = u.substr(0 , u.indexOf("?"));
        query = u.substr(u.indexOf("?") + 1);
        params= query.split('&');
    }else
        path = u;
    return {
        getHost: function(){
            var hostexp = /\/\/([\w.-]*)/;
            var match = hostexp.exec(path);
            if (match != null && match.length > 1)
                return match[1];
            return "";
        },
        getPath: function(){
            var pathexp = /\/\/[\w.-]*(?:\/([^?]*))/;
            var match = pathexp.exec(path);
            if (match != null && match.length > 1)
                return match[1];
            return "";
        },
        getHash: function(){
            return hash;
        },
        getParams: function(){
            return params
        },
        getQuery: function(){
            return query;
        },
        setHash: function(value){
            if(query.length > 0)
                query = "?" + query;
            if(value.length > 0)
                query = query + "#" + value;
            return path + query;
        },
        setParam: function(name, value){
            if(!params){
                params= new Array();
            }
            params.push(name + '=' + value);
            for (var i = 0; i < params.length; i++) {
                if(query.length > 0)
                    query += "&";
                query += params[i];
            }
            if(query.length > 0)
                query = "?" + query;
            if(hash.length > 0)
                query = query + "#" + hash;
            return path + query;
        },
        getParam: function(name){
            if(params){
                for (var i = 0; i < params.length; i++) {
                    var pair = params[i].split('=');
                    if (decodeURIComponent(pair[0]) == name)
                        return decodeURIComponent(pair[1]);
                }
            }
            console.log('Query variable %s not found', name);
        },
        hasParam: function(name){
            if(params){
                for (var i = 0; i < params.length; i++) {
                    var pair = params[i].split('=');
                    if (decodeURIComponent(pair[0]) == name)
                        return true;
                }
            }
            console.log('Query variable %s not found', name);
        },
        removeParam: function(name){
            query = "";
            if(params){
                var newparams = new Array();
                for (var i = 0;i < params.length;i++) {
                    var pair = params[i].split('=');
                    if (decodeURIComponent(pair[0]) != name)
                          newparams .push(params[i]);
                }
                params = newparams;
                for (var i = 0; i < params.length; i++) {
                    if(query.length > 0)
                        query += "&";
                    query += params[i];
                }
            }
            if(query.length > 0)
                query = "?" + query;
            if(hash.length > 0)
                query = query + "#" + hash;
            return path + query;
        },
    }
}


document.write("Host: " + URLParser(url).getHost() + '<br>');
document.write("Path: " + URLParser(url).getPath() + '<br>');
document.write("Query: " + URLParser(url).getQuery() + '<br>');
document.write("Hash: " + URLParser(url).getHash() + '<br>');
document.write("Params Array: " + URLParser(url).getParams() + '<br>');
document.write("Param: " + URLParser(url).getParam('myparam1') + '<br>');
document.write("Has Param: " + URLParser(url).hasParam('myparam1') + '<br>');

document.write(url + '<br>');

// Remove the first parameter
url = URLParser(url).removeParam('myparam1');
document.write(url + ' - Remove the first parameter<br>');

// Add a third parameter
url = URLParser(url).setParam('myparam3',3);
document.write(url + ' - Add a third parameter<br>');

// Remove the second parameter
url = URLParser(url).removeParam('myparam2');
document.write(url + ' - Remove the second parameter<br>');

// Add a hash
url = URLParser(url).setHash('newhash');
document.write(url + ' - Set Hash<br>');

// Remove the last parameter
url = URLParser(url).removeParam('myparam3');
document.write(url + ' - Remove the last parameter<br>');

// Remove a parameter that doesn't exist
url = URLParser(url).removeParam('myparam3');
document.write(url + ' - Remove a parameter that doesn\"t exist<br>');

Einige der hier veröffentlichten Lösungen sind ineffizient. Es ist völlig überflüssig, die Suche nach regulären Ausdrücken jedes Mal zu wiederholen, wenn das Skript auf einen Parameter zugreifen muss. Eine einzige Funktion zum Aufteilen der Parameter in ein Assoziativ-Array-Stilobjekt reicht aus. Wenn Sie nicht mit der HTML 5-Verlaufs-API arbeiten, ist dies nur einmal pro Seite erforderlich. Die anderen Vorschläge hier entschlüsseln die URL auch nicht richtig.

var urlParams;
(window.onpopstate = function () {
    var match,
        pl     = /\+/g,  // Regex for replacing addition symbol with a space
        search = /([^&=]+)=?([^&]*)/g,
        decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
        query  = window.location.search.substring(1);

    urlParams = {};
    while (match = search.exec(query))
       urlParams[decode(match[1])] = decode(match[2]);
})();

Beispiel Querzeichenfolge:

?i=main&mode=front&sid=de8d49b78a85a322c4155015fdce22c4&enc=+Hello%20&empty

Ergebnis:

 urlParams = {
    enc: " Hello ",
    i: "main",
    mode: "front",
    sid: "de8d49b78a85a322c4155015fdce22c4",
    empty: ""
}

alert(urlParams["mode"]);
// -> "front"

alert("empty" in urlParams);
// -> true

Dies kann leicht verbessert werden, um Abfragezeichenfolgen im Array-Stil zu verarbeiten. Ein Beispiel hierfür ist here , aber da in RFC 3986 keine Array-Parameter definiert werden, wird diese Antwort nicht mit dem Quellcode verunreinigt. Wenn Sie sich für eine "verschmutzte" Version interessieren, sehen Sie sich unten die Antwort von campbeln an .

Wie in den Kommentaren dargelegt, ist ein gesetzlicher Begrenzer für key=value . Es wäre eine kompliziertere Regex erforderlich, um damit umzugehen ; oder & , was ich für unnötig halte, weil es selten ist ; verwendet wird, und ich würde noch unwahrscheinlicher sagen, dass beide verwendet werden würden. Wenn Sie Unterstützung brauchen Anstelle von & tauschen Sie sie einfach in der Regex.

Wenn Sie eine serverseitige Vorverarbeitungssprache verwenden, möchten Sie möglicherweise die systemeigenen JSON-Funktionen verwenden, um das schwere Abheben für Sie durchzuführen. Zum Beispiel können Sie in PHP schreiben:

<script>var urlParams = <?php echo json_encode($_GET, JSON_HEX_TAG);?>;</script>

Viel einfacher!


Hier ist ein schneller Weg, um ein Objekt zu erhalten, das dem PHP $_GET Array ähnlich ist:

function get_query(){
    var url = location.search;
    var qs = url.substring(url.indexOf('?') + 1).split('&');
    for(var i = 0, result = {}; i < qs.length; i++){
        qs[i] = qs[i].split('=');
        result[qs[i][0]] = decodeURIComponent(qs[i][1]);
    }
    return result;
}

Verwendungszweck:

var $_GET = get_query();

Für die Abfragezeichenfolge x=5&y&z=hello&x=6 wird das Objekt zurückgegeben:

{
  x: "6",
  y: undefined,
  z: "hello"
}

Hier ist mein Versuch, die exzellente Lösung von Andy E zu einem vollwertigen jQuery-Plugin zu machen:

;(function ($) {
    $.extend({      
        getQueryString: function (name) {           
            function parseParams() {
                var params = {},
                    e,
                    a = /\+/g,  // Regex for replacing addition symbol with a space
                    r = /([^&=]+)=?([^&]*)/g,
                    d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
                    q = window.location.search.substring(1);

                while (e = r.exec(q))
                    params[d(e[1])] = d(e[2]);

                return params;
            }

            if (!this.queryStringParams)
                this.queryStringParams = parseParams(); 

            return this.queryStringParams[name];
        }
    });
})(jQuery);

Die Syntax lautet:

var someVar = $.getQueryString('myParam');

Beste aus beiden Welten!


Nur eine weitere Empfehlung. Das Plug-In- Purl ermöglicht das Abrufen aller URL-Teile, einschließlich Anker, Host usw.

Es kann mit oder ohne jQuery verwendet werden.

Die Verwendung ist sehr einfach und cool:

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

URI.js 11. November 2014 wird Purl jedoch nicht mehr gepflegt, und der Autor empfiehlt, stattdessen URI.js verwenden. Das jQuery-Plugin unterscheidet sich insofern, als es sich auf Elemente konzentriert - verwenden Sie für die Verwendung von Strings einfach die URI direkt, mit oder ohne jQuery. Ein ähnlicher Code würde hier so aussehen, vollere Dokumente here :

var url = new URI('http://allmarkedup.com/folder/dir/index.html?item=value'); // plain JS version
url.protocol(); // returns 'http'
url.path(); // returns '/folder/dir/index.html'

Roshambo auf snipplr.com verfügt über ein einfaches Skript, um dies unter URL-Parameter mit jQuery | beschrieben zu erreichen Verbessert Mit seinem Skript können Sie auch einfach die gewünschten Parameter herausziehen.

Hier ist der Kern:

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

Dann holen Sie sich einfach Ihre Parameter aus der Abfragezeichenfolge.

Wenn also die URL / xyz.com/index.html?lang=de .

Rufen var langval = $.urlParam('lang'); einfach var langval = $.urlParam('lang'); und du hast es.

UZBEKJON hat auch einen großartigen Blog-Post dazu: URL-Parameter und Werte mit jQuery abrufen .


Verwenden Sie einfach zwei Splits :

function get(n) {
    var half = location.search.split(n + '=')[1];
    return half !== undefined ? decodeURIComponent(half.split('&')[0]) : null;
}

Ich las alle vorherigen und vollständigeren Antworten. Aber ich denke, das ist die einfachste und schnellere Methode. Sie können diesen jsPerf- benchmark einchecken

Um das Problem in Rups Kommentar zu lösen, fügen Sie eine bedingte Aufteilung hinzu, indem Sie die erste Zeile in die beiden folgenden Zeilen ändern. Absolute Genauigkeit bedeutet jedoch, dass sie jetzt langsamer ist als Regex (siehe jsPerf ).

function get(n) {
    var half = location.search.split('&' + n + '=')[1];
    if (!half) half = location.search.split('?' + n + '=')[1];
    return half !== undefined ? decodeURIComponent(half.split('&')[0]) : null;
}

Wenn Sie also wissen, dass Sie nicht auf Rups Gegenfall stoßen, gewinnt dies. Ansonsten regexp.

Oder wenn Sie die Abfragezeichenfolge kontrollieren können und garantieren können, dass ein Wert, den Sie abrufen möchten, niemals URL-kodierte Zeichen enthält (die Angabe dieser Werte in einem Wert wäre eine schlechte Idee), können Sie die folgende etwas vereinfachtere und lesbarere Version verwenden der ersten Option:

    function getQueryStringValueByName(name) {
        var queryStringFromStartOfValue = location.search.split(name + '=')[1];
         return queryStringFromStartOfValue !== undefined ? queryStringFromStartOfValue.split('&')[0] : null;

Wenn Sie jQuery verwenden, können Sie eine Bibliothek verwenden, z. B. jQuery BBQ: Zurück und Query Library .

... jQuery BBQ stellt eine vollständige .deparam() -Methode .deparam() , zusammen mit der .deparam() und den Fragment / Query-String-Analyse- und Merge-Utility-Methoden.

Bearbeiten: Deparam hinzufügen Beispiel:

 var DeparamExample = function() {
            var params = $.deparam.querystring();

            //nameofparam is the name of a param from url
            //code below will get param if ajax refresh with hash
            if (typeof params.nameofparam == 'undefined') {
                params = jQuery.deparam.fragment(window.location.href);
            }
            
            if (typeof params.nameofparam != 'undefined') {
                var paramValue = params.nameofparam.toString();
                  
            }
        };

Wenn Sie nur einfaches JavaScript verwenden möchten, können Sie ...

var getParamValue = (function() {
    var params;
    var resetParams = function() {
            var query = window.location.search;
            var regex = /[?&;](.+?)=([^&;]+)/g;
            var match;

            params = {};

            if (query) {
                while (match = regex.exec(query)) {
                    params[match[1]] = decodeURIComponent(match[2]);
                }
            }    
        };

    window.addEventListener
    && window.addEventListener('popstate', resetParams);

    resetParams();

    return function(param) {
        return params.hasOwnProperty(param) ? params[param] : null;
    }

})();​

Aufgrund der neuen HTML-Verlaufs-API und insbesondere von history.pushState() und history.replaceState() kann sich die URL ändern, wodurch der Cache von Parametern und deren Werten ungültig wird.

Diese Version aktualisiert den internen Cache der Parameter bei jeder Änderung des Verlaufs.


Update: Sep-2018

Sie können URLSearchParams verwenden, was einfach ist und eine gute Browserunterstützung bietet.

const urlParams = new URLSearchParams(window.location.search);
const myParam = urlParams.get('myParam');

Orignal

Sie brauchen jQuery dafür nicht. Sie können nur etwas reines JavaScript verwenden:

function getParameterByName(name, url) {
    if (!url) url = window.location.href;
    name = name.replace(/[\[\]]/g, '\\$&');
    var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, ' '));
}

Verwendungszweck:

// query string: ?foo=lorem&bar=&baz
var foo = getParameterByName('foo'); // "lorem"
var bar = getParameterByName('bar'); // "" (present with empty value)
var baz = getParameterByName('baz'); // "" (present with no value)
var qux = getParameterByName('qux'); // null (absent)


Hinweis: Wenn ein Parameter mehrmals vorhanden ist ( ?foo=lorem&foo=ipsum ), erhalten Sie den ersten Wert ( lorem ). Es gibt keinen Standard dazu, und die Verwendung variiert, siehe zum Beispiel diese Frage: Autorisierende Position doppelter HTTP-GET-Abfrageschlüssel .
HINWEIS: Die Funktion unterscheidet zwischen Groß- und Kleinschreibung. Wenn Sie den Parameternamen ohne Berücksichtigung der Groß- und Kleinschreibung bevorzugen, fügen Sie RegExp den Modifikator "i" hinzu

Dies ist ein Update, das auf den neuen URLSearchParams-Spezifikationen basiert, um das gleiche Ergebnis noch präziser zu erreichen. Siehe die Antwort mit dem Titel " URLSearchParams " unten.


Code Golf:

var a = location.search&&location.search.substr(1).replace(/\+/gi," ").split("&");
for (var i in a) {
    var s = a[i].split("=");
    a[i]  = a[unescape(s[0])] = unescape(s[1]);
}

Zeigen Sie es an!

for (i in a) {
    document.write(i + ":" + a[i] + "<br/>");   
};

Auf meinem Mac: wird test.htm?i=can&has=cheezburgerangezeigt

0:can
1:cheezburger
i:can
has:cheezburger

Die jQuery-Methode von Roshambo kümmerte sich nicht um die Dekodierungs-URL

http://snipplr.com/view/26662/get-url-parameters-with-jquery--improved/

Fügte diese Fähigkeit auch hinzu, während sie die return-Anweisung hinzufügte

return decodeURIComponent(results[1].replace(/\+/g, " ")) || 0;

Jetzt können Sie den aktualisierten Inhalt finden:

$.urlParam = function(name){
var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
if (!results) { return 0; }
return decodeURIComponent(results[1].replace(/\+/g, " ")) || 0;
}

Ich benutze häufig reguläre Ausdrücke, aber nicht dafür.

Es scheint mir einfacher und effizienter zu sein, die Abfragezeichenfolge einmal in meiner Anwendung zu lesen und aus allen Schlüssel / Wert-Paaren ein Objekt zu erstellen:

var search = function() {
  var s = window.location.search.substr(1),
    p = s.split(/\&/), l = p.length, kv, r = {};
  if (l === 0) {return false;}
  while (l--) {
    kv = p[l].split(/\=/);
    r[kv[0]] = decodeURIComponent(kv[1] || '') || true;
  }
  return r;
}();

Für eine URL wie http://domain.com?param1=val1&param2=val2Sie können Sie den Wert später in Ihrem Code als search.param1und erhalten search.param2.


Dies ist eine Funktion, die ich vor einiger Zeit erstellt habe und mit der ich sehr zufrieden bin. Es wird nicht zwischen Groß- und Kleinschreibung unterschieden - was praktisch ist. Wenn der angeforderte QS nicht vorhanden ist, wird nur eine leere Zeichenfolge zurückgegeben.

Ich verwende eine komprimierte Version davon. Ich poste unkomprimiert für die Neulinge, um besser zu erklären, was los ist.

Ich bin mir sicher, dass dies optimiert oder anders gemacht werden könnte, um schneller zu arbeiten, aber es funktioniert immer gut für das, was ich brauche.

Genießen.

function getQSP(sName, sURL) {
    var theItmToRtn = "";
    var theSrchStrg = location.search;
    if (sURL) theSrchStrg = sURL;
    var sOrig = theSrchStrg;
    theSrchStrg = theSrchStrg.toUpperCase();
    sName = sName.toUpperCase();
    theSrchStrg = theSrchStrg.replace("?", "&") theSrchStrg = theSrchStrg + "&";
    var theSrchToken = "&" + sName + "=";
    if (theSrchStrg.indexOf(theSrchToken) != -1) {
        var theSrchTokenLth = theSrchToken.length;
        var theSrchTokenLocStart = theSrchStrg.indexOf(theSrchToken) + theSrchTokenLth;
        var theLocOfNextAndSign = theSrchStrg.indexOf("&", theSrchTokenLocStart);
        theItmToRtn = unescape(sOrig.substring(theSrchTokenLocStart, theLocOfNextAndSign));
    }
    return unescape(theItmToRtn);
}

Hier ist eine erweiterte Version von Andy Es verknüpfter "Handle array-style query strings" -Version. Fehler behoben ( ?key=1&key[]=2&key[]=3; 1geht verloren und ersetzt durch [2,3]), einige geringfügige Leistungsverbesserungen (erneute Dekodierung von Werten, Neuberechnen der Position "[" usw.) und einige Verbesserungen (funktionalisiert ?key=1&key=2, Unterstützung für ;Trennzeichen) . Ich habe die Variablen ärgerlich kurz gehalten, aber viele Kommentare hinzugefügt, um sie lesbar zu machen (oh, und ich habe sie vinnerhalb der lokalen Funktionen wiederverwendet , wenn dies verwirrend ist;).

Es wird den folgenden Querstring behandeln ...

? test = Hallo & person = neek & person [] = jeff & person [] = jim & person [extra] = john & test3 & nocache = 1398914891264

... daraus ein Objekt machen, das aussieht ...

{
    "test": "Hello",
    "person": {
        "0": "neek",
        "1": "jeff",
        "2": "jim",
        "length": 3,
        "extra": "john"
    },
    "test3": "",
    "nocache": "1398914891264"
}

Wie Sie oben sehen können, übernimmt diese Version ein gewisses Maß an „malformed“ Arrays, dh - person=neek&person[]=jeff&person[]=jimoder person=neek&person=jeff&person=jimals Schlüssel identifizierbar ist und gültig ist (zumindest in dotNet der NameValueCollection.Add ):

Wenn der angegebene Schlüssel bereits in der NameValueCollection-Zielinstanz vorhanden ist, wird der angegebene Wert der vorhandenen durch Kommas getrennten Werteliste in der Form "Wert1, Wert2, Wert3" hinzugefügt.

Es scheint, dass die Jury bei wiederholten Keys etwas ausfällt, da es keine Spezifikationen gibt. In diesem Fall werden mehrere Schlüssel als (gefälschtes) Array gespeichert. Beachten Sie jedoch, dass ich Werte, die auf Kommas basieren, nicht in Arrays verarbeite.

Der Code:

getQueryStringKey = function(key) {
    return getQueryStringAsObject()[key];
};


getQueryStringAsObject = function() {
    var b, cv, e, k, ma, sk, v, r = {},
        d = function (v) { return decodeURIComponent(v).replace(/\+/g, " "); }, //# d(ecode) the v(alue)
        q = window.location.search.substring(1), //# suggested: q = decodeURIComponent(window.location.search.substring(1)),
        s = /([^&;=]+)=?([^&;]*)/g //# original regex that does not allow for ; as a delimiter:   /([^&=]+)=?([^&]*)/g
    ;

    //# ma(make array) out of the v(alue)
    ma = function(v) {
        //# If the passed v(alue) hasn't been setup as an object
        if (typeof v != "object") {
            //# Grab the cv(current value) then setup the v(alue) as an object
            cv = v;
            v = {};
            v.length = 0;

            //# If there was a cv(current value), .push it into the new v(alue)'s array
            //#     NOTE: This may or may not be 100% logical to do... but it's better than loosing the original value
            if (cv) { Array.prototype.push.call(v, cv); }
        }
        return v;
    };

    //# While we still have key-value e(ntries) from the q(uerystring) via the s(earch regex)...
    while (e = s.exec(q)) { //# while((e = s.exec(q)) !== null) {
        //# Collect the open b(racket) location (if any) then set the d(ecoded) v(alue) from the above split key-value e(ntry) 
        b = e[1].indexOf("[");
        v = d(e[2]);

        //# As long as this is NOT a hash[]-style key-value e(ntry)
        if (b < 0) { //# b == "-1"
            //# d(ecode) the simple k(ey)
            k = d(e[1]);

            //# If the k(ey) already exists
            if (r[k]) {
                //# ma(make array) out of the k(ey) then .push the v(alue) into the k(ey)'s array in the r(eturn value)
                r[k] = ma(r[k]);
                Array.prototype.push.call(r[k], v);
            }
            //# Else this is a new k(ey), so just add the k(ey)/v(alue) into the r(eturn value)
            else {
                r[k] = v;
            }
        }
        //# Else we've got ourselves a hash[]-style key-value e(ntry) 
        else {
            //# Collect the d(ecoded) k(ey) and the d(ecoded) sk(sub-key) based on the b(racket) locations
            k = d(e[1].slice(0, b));
            sk = d(e[1].slice(b + 1, e[1].indexOf("]", b)));

            //# ma(make array) out of the k(ey) 
            r[k] = ma(r[k]);

            //# If we have a sk(sub-key), plug the v(alue) into it
            if (sk) { r[k][sk] = v; }
            //# Else .push the v(alue) into the k(ey)'s array
            else { Array.prototype.push.call(r[k], v); }
        }
    }

    //# Return the r(eturn value)
    return r;
};

Ich brauchte ein Objekt aus der Abfragezeichenfolge und ich hasse jede Menge Code. Es ist vielleicht nicht das robusteste im Universum, aber es sind nur ein paar Zeilen Code.

var q = {};
location.href.split('?')[1].split('&').forEach(function(i){
    q[i.split('=')[0]]=i.split('=')[1];
});

Eine URL wie this.htm?hello=world&foo=barwird erstellt:

{hello:'world', foo:'bar'}

Ich mag dieses (aus jquery-howto.blogspot.co.uk):

// get an array with all querystring values
// example: var valor = getUrlVars()["valor"];
function getUrlVars() {
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for (var i = 0; i < hashes.length; i++) {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

Funktioniert gut für mich.


function GET() {
        var data = [];
        for(x = 0; x < arguments.length; ++x)
            data.push(location.href.match(new RegExp("/\?".concat(arguments[x],"=","([^\n&]*)")))[1])
                return data;
    }


example:
data = GET("id","name","foo");
query string : ?id=3&name=jet&foo=b
returns:
    data[0] // 3
    data[1] // jet
    data[2] // b
or
    alert(GET("id")[0]) // return 3

function GetQueryStringParams(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];
        }
    }
}​

Und so können Sie diese Funktion verwenden, vorausgesetzt, die URL ist

http://dummy.com/?stringtext=jquery&stringword=jquerybyexample

var tech = GetQueryStringParams('stringtext');
var blog = GetQueryStringParams('stringword');






query-string