Wie erhalte ich den Wert aus den GET-Parametern?

1327

Ich habe eine URL mit einigen GET-Parametern wie folgt:

www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 

Ich muss den ganzen Wert von bekommen c. Ich habe versucht, die URL zu lesen, aber ich habe nur m2. Wie mache ich das mit JavaScript?

Joe
quelle
Bevor Sie eine neue Antwort veröffentlichen, sollten Sie berücksichtigen, dass diese Frage bereits über 50 Antworten enthält. Stellen Sie sicher, dass Ihre Antwort Informationen enthält, die nicht zu den vorhandenen Antworten gehören.
Janniks

Antworten:

1998

In JavaScript selbst ist nichts für die Verarbeitung von Abfragezeichenfolgenparametern integriert.

Code, der in einem (modernen) Browser ausgeführt wird, kann das URLObjekt verwenden (das Teil der APIs ist, die von Browsern für JS bereitgestellt werden):

var url_string = "http://www.example.com/t.html?a=1&b=3&c=m2-m3-m4-m5"; //window.location.href
var url = new URL(url_string);
var c = url.searchParams.get("c");
console.log(c);


Für ältere Browser (einschließlich Internet Explorer) können Sie diese Polyfüllung oder den Code aus der Originalversion dieser Antwort verwenden, die älter ist als URL:

Sie könnten darauf zugreifen location.search, was Ihnen von der geben würde? Zeichen bis zum Ende der URL oder dem Beginn der Fragmentkennung (#foo) erhalten würde, je nachdem, was zuerst eintritt.

Dann können Sie es damit analysieren:

function parse_query_string(query) {
  var vars = query.split("&");
  var query_string = {};
  for (var i = 0; i < vars.length; i++) {
    var pair = vars[i].split("=");
    var key = decodeURIComponent(pair[0]);
    var value = decodeURIComponent(pair[1]);
    // If first entry with this name
    if (typeof query_string[key] === "undefined") {
      query_string[key] = decodeURIComponent(value);
      // If second entry with this name
    } else if (typeof query_string[key] === "string") {
      var arr = [query_string[key], decodeURIComponent(value)];
      query_string[key] = arr;
      // If third or later entry with this name
    } else {
      query_string[key].push(decodeURIComponent(value));
    }
  }
  return query_string;
}

var query_string = "a=1&b=3&c=m2-m3-m4-m5";
var parsed_qs = parse_query_string(query_string);
console.log(parsed_qs.c);

Sie können die Abfragezeichenfolge von der URL der aktuellen Seite abrufen mit:

var query = window.location.search.substring(1);
var qs = parse_query_string(query);
QUentin
quelle
Für ältere Browser benötigen Sie möglicherweise zusätzlich zu der für eine PolyfüllungURLURLSearchParams . Oder Sie können diesem Problem ausweichen, indem Sie die Zeile var c = url.searchParams.get("c");in der obigen Antwort durch ersetzen var c = new URLSearchParams(window.location.search).get("c");.
evanrmurphy
parse_query_string schlägt für Werte fehl, die '=' enthalten, z. B. wenn ein base64-codierter Wert als Wert übergeben wird. Die unten stehende Version mit regulärem Ausdruck funktioniert besser.
Manel Clos
7
@ Jamland - Mach das auf keinen Fall. Es wird Dinge brechen. Hier ist eine Live-Demo, die new URL() erwartet, eine ordnungsgemäß codierte URL als Argument zu erhalten. decodeURIComponenterwartet, dass eine Komponente einer URL übergeben wird, nicht eine ganze URL.
Quentin
@ Quentin Ich habe verschiedene Sonderzeichen überprüft und ich sehe, dass Sie Recht haben. decodeURIComponentsollte in diesem Fall nicht verwendet werden
Jamland
1
Die parse_query_stringFunktion führt eine Doppeldecodierung von durch value. Das =von @ManelClos erwähnte Problem kann durch Hinzufügen eines zweiten Parameters 2( limit) behoben werden vars[i].split().
Jake
242

Die meisten Implementierungen, die ich gesehen habe, haben die URL-Dekodierung der Namen und Werte verpasst.

Hier ist eine allgemeine Dienstprogrammfunktion, die auch die richtige URL-Dekodierung durchführt:

function getQueryParams(qs) {
    qs = qs.split('+').join(' ');

    var params = {},
        tokens,
        re = /[?&]?([^=]+)=([^&]*)/g;

    while (tokens = re.exec(qs)) {
        params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
    }

    return params;
}

//var query = getQueryParams(document.location.search);
//alert(query.foo);
Ates Goral
quelle
3
Dieser Code funktioniert nicht. Es wird eine Endlosschleife erstellt, da der reguläre Ausdruck in der Schleifendefinition kompiliert wird, die den aktuellen Index zurücksetzt. Es funktioniert ordnungsgemäß, wenn Sie den regulären Ausdruck in eine Variable außerhalb der Schleife einfügen.
Maxhawkins
2
@maxhawkins: Es funktioniert in einigen Browsern, während es in anderen in eine Endlosschleife geht. In dieser Hinsicht haben Sie halb recht. Ich werde den Code so einstellen, dass er browserübergreifend ist. Vielen Dank für den Hinweis!
Ates Goral
3
@ZiTAL Diese Funktion wird mit dem Abfrageteil einer URL verwendet, nicht mit der gesamten URL. Siehe das auskommentierte Verwendungsbeispiel unten.
Ates Goral
1
@ Harvey Groß- und Kleinschreibung wird bei Abfrageparametern nicht berücksichtigt. Es klingt wie eine anwendungsspezifische Sache, die zusammen mit oder zusätzlich zur Extraktion von Abfrageparametern angewendet werden sollte.
Ates Goral
7
Warum qs.split('+').join(' ');und nicht qs.replace(/\+/g, ' ');?
FlameStorm
234

Quelle

function gup( name, url ) {
    if (!url) url = location.href;
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)";
    var regex = new RegExp( regexS );
    var results = regex.exec( url );
    return results == null ? null : results[1];
}
gup('q', 'hxxp://example.com/?q=abc')
Haim Evgi
quelle
8
Ich mag diese Option am besten, gebe aber lieber null oder das Ergebnis zurück, aber keine leere Zeichenfolge.
Jason Thrasher
1
Es sieht so aus, als hätten Sie einige zusätzliche Fluchtzeichen. "\\[" sollte sein "\[". Da es sich um reguläre Zeichenfolgen handelt, müssen [und] nicht maskiert werden.
EricP
Dies unterscheidet nicht zwischen Groß- und Kleinschreibung. Wo würde ich das "i" hinzufügen, um die Groß- und Kleinschreibung nicht zu berücksichtigen?
Zeta
alert (gup ('UserID', window.location.href));
Arun Prasad ES
6
@mottie dead link
Invot
202

Dies ist eine einfache Möglichkeit, nur einen Parameter zu überprüfen:

Beispiel-URL:

    http://myserver/action?myParam=2

Beispiel Javascript:

    var myParam = location.search.split('myParam=')[1]

Wenn "myParam" in der URL ... -Variable vorhanden ist, enthält myParam "2", andernfalls ist es undefiniert.

Vielleicht möchten Sie in diesem Fall einen Standardwert:

    var myParam = location.search.split('myParam=')[1] ? location.search.split('myParam=')[1] : 'myDefaultValue';

Update: Das funktioniert besser:

    var url = "http://www.example.com/index.php?myParam=384&login=admin"; // or window.location.href for current url
    var captured = /myParam=([^&]+)/.exec(url)[1]; // Value is in [1] ('384' in our case)
    var result = captured ? captured : 'myDefaultValue';

Und es funktioniert auch dann richtig, wenn die URL voller Parameter ist.

mzalazar
quelle
36
Dies funktioniert nur, wenn der Parameter, den Sie abrufen, der letzte in der URL ist, von dem Sie nicht abhängig sein sollten (selbst wenn Sie nur einen Parameter erwarten). zB http://myserver/action?myParam=2&anotherParam=3würde "2"aber nicht nachgeben "2&anotherParam=3".
Gletscher
39
(location.search.split('myParam=')[1]||'').split('&')[0]- zur Verwendung mit mehreren Parametern oder möglicherweise fehlenden myParam .
Gábor Imre
oderlocation.search.split('myParam=').splice(1).join('').split('&')[0]
J.Steve
1
Sie können mehr Präzision erzielen und eine beliebige Reihenfolge von Parametern zulassen, indem Sie [?|&]wie in[?|&]myParam=([^&]+)
1,21 Gigawatt
1
Möglicherweise müssen Sie den Wert dekodierenresult = decodeURIComponent(result);
1,21 Gigawatt
126

Browser-Anbieter haben eine native Methode implementiert, um dies über URL und URLSearchParams zu tun.

let url = new URL('http://www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5');
let searchParams = new URLSearchParams(url.search);
console.log(searchParams.get('c'));  // outputs "m2-m3-m4-m5"

Wird derzeit in Firefox, Opera, Safari, Chrome und Edge unterstützt. Eine Liste der Browserunterstützung finden Sie hier .

https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams https://developer.mozilla.org/en-US/docs/Web/API/URL/URL

https://url.spec.whatwg.org/

Eric Bidelman, Ingenieur bei Google, empfiehlt die Verwendung dieser Polyfüllung für nicht unterstützte Browser.

cgatian
quelle
Gemäß den MDN-Links unterstützt Safari die URL, nicht jedoch URLSearchParams.
Mark Thomson
3
@Markouver Kümmert sich die Polyfill nicht darum? Übrigens, Safari ist der moderne IE6
Csaba Toth
Warum ist die new URLSearchParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5").get('a')Rückkehr nullfür mich? (Auf Chrome Stall). bund cscheinen gut zu funktionieren.
Ripper234
Antwort aktualisiert. Meine ursprüngliche Antwort war, URLSearchParams nicht richtig zu verwenden, da es nur für den Querystring-Teil der URL ausgelegt ist.
Cgatian
1
Verwenden Sie url.searchParamsstattdessen new URLSearchParams(url.search).
Caio Tarifa
86

Ich fand das vor Ewigkeiten sehr einfach:

function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,    
    function(m,key,value) {
      vars[key] = value;
    });
    return vars;
  }

Dann nenne es so:

var fType = getUrlVars()["type"];
Abhauen
quelle
7
+1 großartige Lösung - elegant, effizient und intelligent sind die Nutzungsbedingungen. Für meine Zwecke besser als die andere akzeptierte Lösung
Elemental
kurz + einfach + kraftvoll = großartig
mzy
1
Sehr schön, es funktioniert auch mit location.search anstelle von window.location.href
Fabio C.
1
@pdxbmw Es ist nutzlos und sollte entfernt werden. Der Code mag auf den ersten Blick klug erscheinen, ist aber nicht sehr gut durchdacht. Verbesserungen: Verwenden Sie den decodeURIComponent()Wert, da Sie normalerweise damit arbeiten möchten. Verwenden Sie window.location.searchstattdessen window.location.href, weil Sie nur an den Parametern interessiert sind, nicht an der gesamten URL.
Leif
2
@ Leif Vorschlag hat super funktioniert. Ich habe eine ID 142 # erhalten, weil am Ende der URL die # per Knopfdruck generiert wurde. Die Funktion so verlassenvar vars = {}; window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; }); return vars;
Andres Ramos
77

Sie können die Abfragezeichenfolge eingeben location.searchund dann alles nach dem Fragezeichen aufteilen:

var params = {};

if (location.search) {
    var parts = location.search.substring(1).split('&');

    for (var i = 0; i < parts.length; i++) {
        var nv = parts[i].split('=');
        if (!nv[0]) continue;
        params[nv[0]] = nv[1] || true;
    }
}

// Now you can get the parameters you want like so:
var abc = params.abc;
Blixt
quelle
3
Was ist mit der URL-Dekodierung der Parameternamen und -werte?
Ates Goral
Dieser Ansatz behandelt keine Arrays. ZB ?array[]=1&array[]=2produziert {"array[]": "2"}, was eindeutig falsch ist.
Kafoso
@Kafoso Hier gibt es kein klares Richtig oder Falsch. Erstens haben wiederholte Felder mit demselben Namen kein festgelegtes Standardverhalten und müssen vom Parser verarbeitet werden. Darüber hinaus hat das []Muster nur in einigen Fällen eine Bedeutung (z. B. PHP), in anderen jedoch nicht. Also nicht "eindeutig falsch" - nur nicht implementiert, um einen nicht standardmäßigen Fall zu behandeln, den Sie möglicherweise behandeln müssen oder nicht.
Blixt
38

Ich habe eine einfachere und elegantere Lösung geschrieben.

var arr = document.URL.match(/room=([0-9]+)/)
var room = arr[1];
Natus Drew
quelle
Schauen Sie sich das an, zwei Zeilen, die genau das tun, was es verspricht - und nicht kaputt gehen, wenn jemand versucht, nach Schwachstellen zu suchen, und im Gegensatz zu einigen dieser Lösungen eine Reihe zusätzlicher Zeichen und Abfragen hinzufügt. Prost, Junge!
David G
Dies macht den Job richtig und nur in 2 Zeilen. Gute Antwort!
Andres Ramos
Ich denke, es wäre praktisch für andere, eine Prüfung auf Null war enthalten. Wenn nicht, finden Sie hier ein Beispiel: stackoverflow.com/a/36076822/1945948 (Ich habe einen Bearbeitungsversuch abgelehnt).
atw
Verstehe nicht ... wie beantwortet dies die Frage, bei der es darum geht, Parameter aus einer bestimmten Zeichenfolge abzurufen: "www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5"?
Mike Nagetier
Liebte diese Antwort, + 1'ed. Nur ein Vorschlag, können Sie [0-9] für\d
Gmanjon
31

Eine super einfache Möglichkeit, URLSearchParams zu verwenden .

function getParam(param){
  return new URLSearchParams(window.location.search).get(param);
}

Es wird derzeit in Chrome, Firefox, Safari, Edge und anderen unterstützt .

spencer.sm
quelle
Erhalten Sie die Fehlermeldung: 'SCRIPT5009:' URLSearchParams 'ist nicht definiert', wenn es in Edge ausgeführt wird.
Andreas Presthammer
@AndreasPresthammer Welche Version von Edge?
spencer.sm
@ Spencer-Sm Microsoft Edge 41.16299.820.0
Andreas Presthammer
Funktioniert nicht mit hübschen URL-Parametern
ii iml0sto1
@ iiiml0sto1 Was sind "hübsche URL-Parameter"?
spencer.sm
30

Hier ist eine rekursive Lösung ohne Regex und mit minimaler Mutation (nur das params-Objekt ist mutiert, was meiner Meinung nach in JS unvermeidbar ist).

Es ist großartig, weil es:

  • Ist rekursiv
  • Behandelt mehrere gleichnamige Parameter
  • Kann gut mit fehlerhaften Parameterzeichenfolgen umgehen (fehlende Werte usw.)
  • Bricht nicht, wenn '=' im Wert ist
  • Führt eine URL-Dekodierung durch
  • Und schließlich ist es großartig, weil es ... argh !!!

Code:

var get_params = function(search_string) {

  var parse = function(params, pairs) {
    var pair = pairs[0];
    var parts = pair.split('=');
    var key = decodeURIComponent(parts[0]);
    var value = decodeURIComponent(parts.slice(1).join('='));

    // Handle multiple parameters of the same name
    if (typeof params[key] === "undefined") {
      params[key] = value;
    } else {
      params[key] = [].concat(params[key], value);
    }

    return pairs.length == 1 ? params : parse(params, pairs.slice(1))
  }

  // Get rid of leading ?
  return search_string.length == 0 ? {} : parse({}, search_string.substr(1).split('&'));
}

var params = get_params(location.search);

// Finally, to get the param you want
params['c'];
Jai
quelle
31
Sie ... Sie sagten zweimal rekursiv.
Dissident Rage
Es kann den ersten Parameter in der nächsten URL nicht finden: www.mysite.com?first=1&second=2
Mario Radomanana
Hallo Mario, hier ist eine JSFiddle, die zeigt, wie sie mit dieser URL funktioniert : jsfiddle.net/q6xfJ - Wenn Sie einen Fehler gefunden haben, ist dieser möglicherweise browserspezifisch ? Beachten Sie beim Testen, dass die von mir angegebene Antwort location.search verwendet. Dies ist der Teil '? First = 1 & second = 2' der URL. Prost :)
Jai
45
Ich verstehe nicht, warum etwas gut ist, nur weil es rekursiv ist.
Adam Arold
6
Ähm, ich denke du hast den Rekursionswitz dort verpasst, Adam. Obwohl jetzt jeder es vermissen wird, weil edi9999 das zweite "Ist rekursiv" entfernt hat.
Jai
27

Ich habe eine Funktion erstellt, die dies tut:

var getUrlParams = function (url) {
  var params = {};
  (url + '?').split('?')[1].split('&').forEach(function (pair) {
    pair = (pair + '=').split('=').map(decodeURIComponent);
    if (pair[0].length) {
      params[pair[0]] = pair[1];
    }
  });
  return params;
};

Update 26.05.2017, hier ist eine ES7-Implementierung (läuft mit der voreingestellten Stufe 0, 1, 2 oder 3 von babel):

const getUrlParams = url => `${url}?`.split('?')[1]
  .split('&').reduce((params, pair) =>
    ((key, val) => key ? {...params, [key]: val} : params)
    (...`${pair}=`.split('=').map(decodeURIComponent)), {});

Einige Tests:

console.log(getUrlParams('https://google.com/foo?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('/foo?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('https://google.com/')); // Will log {}
console.log(getUrlParams('a=1&b=2&c')); // Will log {}

Update 26.03.2008, hier ist eine Typescript-Implementierung:

const getUrlParams = (search: string) => `${search}?`
  .split('?')[1]
  .split('&')
  .reduce(
    (params: object, pair: string) => {
      const [key, value] = `${pair}=`
        .split('=')
        .map(decodeURIComponent)

      return key.length > 0 ? { ...params, [key]: value } : params
    },
    {}
  )

Update 13.02.2019, hier ist eine aktualisierte TypeScript-Implementierung, die mit TypeScript 3 funktioniert.

interface IParams { [key: string]: string }

const paramReducer = (params: IParams, pair: string): IParams => {
  const [key, value] = `${pair}=`.split('=').map(decodeURIComponent)

  return key.length > 0 ? { ...params, [key]: value } : params
}

const getUrlParams = (search: string): IParams =>
  `${search}?`.split('?')[1].split('&').reduce<IParams>(paramReducer, {})
Nate Ferrero
quelle
Bei einer URL ohne Abfrageparameter wird dies zurückgegeben Object {"": ""}
Ilya Semenov
2
Sieht für mich sauber genug aus. Der Rest der Antworten ist einfach zu viel "Magie" ohne ausreichende Erklärung.
Levi Roberts
Das ist eine großartige Antwort!
Spencer Bigum
Danke @SpencerBigum!
Nate Ferrero
24

Sieh dir das an

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("Parameter:" + arrParamValues[i]);
                return arrParamValues[i];
            }
        }
        return "No Parameters Found";
    }
}
Dhiral Pandya
quelle
1
Vielen Dank. Ich bin neu in jscript und das wird ziemlich hilfreich sein.
Brian B.
20

ECMAScript 6-Lösung:

var params = window.location.search
  .substring(1)
  .split("&")
  .map(v => v.split("="))
  .reduce((map, [key, value]) => map.set(key, decodeURIComponent(value)), new Map())
veiset
quelle
Nett. Zu Ihrer Information, da es sich um eine Karte handelt, lautet die Verwendung params.get ("Schlüssel").
evanmcd
Ich mag es, aber wahrscheinlich wird es nicht den ersten Parameter bekommen. Ich habe eine Funktion basierend auf Ihrem Beispiel erstellt function urlParams(url) { const [, searchParams = ''] = url.split('?') return searchParams.split('&') .map(v => v.split('=')) .reduce((map, [key = '', value]) => key.length ? map.set(key, decodeURIComponent(value)) : map, new Map()) }
mah.cr
11

ich benutze

function getVal(str) {
    var v = window.location.search.match(new RegExp('(?:[\?\&]'+str+'=)([^&]+)'));
    return v ? v[1] : null;
}
Fancyoung
quelle
Bitte fügen Sie eine Erklärung hinzu. Ihre Antwort ist derzeit als "niedrige Qualität" gekennzeichnet und wird möglicherweise ohne entfernt.
Johannes Jander
Ich fand heraus, dass, wenn am Ende der URL eine Zeichenfolge wie '#id' steht und der letzte Parameterwert wie 'somevalue # id' zurückgegeben wird
Ayano
@Ayano enthält window.location.searchkein Hash wie #id.
Fancyoung
@Fancyoung Ja, Sie haben Recht, ich habe einen Fehler gemacht, der verwendet wurde location.href, um das Ergebnis anstelle der location.search.Danke zu vergleichen.
Ayano
11

Ich benutze die parseUri Bibliothek. Damit können Sie genau das tun, wonach Sie fragen:

var uri = 'www.test.com/t.html&a=1&b=3&c=m2-m3-m4-m5';
var c = uri.queryKey['c'];
// c = 'm2-m3-m4-m5'
Chris Dutrow
quelle
9

Hier ist meine Lösung. Wie von Andy E bei der Beantwortung dieser Frage empfohlen , ist es nicht gut für die Leistung Ihres Skripts, wenn wiederholt verschiedene Regex-Zeichenfolgen erstellt, Schleifen ausgeführt usw. werden, um nur einen einzigen Wert zu erhalten. Also habe ich mir ein einfacheres Skript ausgedacht, das alle GET-Parameter in einem einzigen Objekt zurückgibt. Sie sollten es nur einmal aufrufen, das Ergebnis einer Variablen zuweisen und dann zu einem späteren Zeitpunkt mit dem entsprechenden Schlüssel einen beliebigen Wert von dieser Variablen abrufen. Beachten Sie, dass es sich auch um die URI-Dekodierung kümmert (z. B.% 20) und + durch ein Leerzeichen ersetzt:

 function getUrlQueryParams(url) {
  var queryString = url.split("?")[1];
  var keyValuePairs = queryString.split("&");
  var keyValue = [];
  var queryParams = {};
  keyValuePairs.forEach(function(pair) {
    keyValue = pair.split("=");
    queryParams[keyValue[0]] = decodeURIComponent(keyValue[1]).replace(/\+/g, " ");
});
  return queryParams;
}

Hier sind einige Tests des Skripts, die Sie sehen können:

// Query parameters with strings only, no special characters.
var currentParams = getUrlQueryParams("example.com/foo?number=zero");
alert(currentParams["number"]); // Gives "zero".

// For the URL you stated above...
var someParams = getUrlQueryParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 ");
alert(someParams["c"]); // Gives "m2-m3-m4-m5".

// For a query params with URI encoding...
var someParams = getUrlQueryParams("www.example.com/t.html?phrase=a%20long%20shot&location=Silicon+Valley%2C+USA");
alert(someParams["phrase"]); // Gives "a long shot".
alert(someParams["location"]); // Gives "Silicon Valley, USA".
Folusho Oladipo
quelle
.replace ("+", "") ersetzt nur das erste Vorkommen. Sie müssen .replace (/ \ + / g, "") verwenden.
Tony
8

Oder wenn Sie die Verwendung des URI-Parsing-Rads nicht neu erfinden möchten URI.js.

So ermitteln Sie den Wert eines Parameters mit dem Namen foo:

new URI((''+document.location)).search(true).foo

Was das tut ist

  1. Konvertieren Sie document.location in eine Zeichenfolge (es ist ein Objekt).
  2. Führen Sie diese Zeichenfolge dem URI-Klassenkonstrutor von URI.js zu
  3. Rufen Sie die Funktion search () auf, um den Suchabschnitt (Abfrage) der URL abzurufen
    (die Übergabe von true weist sie an, ein Objekt auszugeben).
  4. Greifen Sie auf die foo-Eigenschaft des resultierenden Objekts zu, um den Wert abzurufen

Hier ist eine Geige dafür ... http://jsfiddle.net/m6tett01/12/

Gus
quelle
8

Verwenden Sie für einen einzelnen Parameterwert wie diesen index.html? Msg = 1 den folgenden Code:

$(window).load(function(){
    queryString();
});

function queryString()
{
    var queryString = window.location.search.substring(1);
    var varArray = queryString.split("="); //eg. index.html?msg=1

    var param1 = varArray[0];
    var param2 = varArray[1];

}

Verwenden Sie für alle Parameterwerte den folgenden Code:

$(window).load(function(){
    queryString();
});

function queryString()
{
    var queryString = window.location.search;
    var varArray = queryString.split("&");
    for (var i=0;i<varArray.length;i++) {
      var param = varArray[i].split("=");
        //parameter-value pair
    }
} 
Ravi Patel
quelle
1
Ich mag diese Lösung!
Alemur
8

Hier poste ich ein Beispiel. Aber es ist in jQuery. Hoffe, es wird anderen helfen:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.url.js"></script>

<!-- URL:  www.example.com/correct/?message=done&year=1990-->

<script type="text/javascript">
$(function(){
    $.url.attr('protocol')  // --> Protocol: "http"
    $.url.attr('path')          // --> host: "www.example.com"
    $.url.attr('query')         // --> path: "/correct/"
    $.url.attr('message')   // --> query: "done"
    $.url.attr('year')      // --> query: "1990"
});
</script>
Sariban D'Cl
quelle
1
Von Ihrem anderen Beitrag kopiert: "Benötigt das URL-Plugin: plugins.jquery.com/url"
zeta
8

Der kürzeste Weg:

new URL(location.href).searchParams.get("my_key");
Zon
quelle
2
Ich würde die Verwendung von new URL(location.href).searchParams.get("my_key")over bevorzugen, URLSearchParamsda letzteres beim Abrufen des ersten Abfrageparameters einer URL fehlschlägt.
Travis Clarke
1
Beide Varianten getestet. Ich stimme mit Ihnen ein. Antwort bearbeitet.
Zon
7

Diese Frage hat zu viele Antworten, also füge ich eine weitere hinzu.

/**
 * parses and returns URI query parameters 
 * 
 * @param {string} param parm
 * @param {bool?} asArray if true, returns an array instead of a scalar 
 * @returns {Object|Array} 
 */
function getURIParameter(param, asArray) {
    return document.location.search.substring(1).split('&').reduce(function(p,c) {
        var parts = c.split('=', 2).map(function(param) { return decodeURIComponent(param); });
        if(parts.length == 0 || parts[0] != param) return (p instanceof Array) && !asArray ? null : p;
        return asArray ? p.concat(parts.concat(true)[1]) : parts.concat(true)[1];
    }, []);
}

Verwendungszweck:

getURIParameter("id")  // returns the last id or null if not present
getURIParameter("id", true) // returns an array of all ids

Dies bewältigt leere Parameter (die Schlüssel sind ohne vorhanden "=value"), die Offenlegung sowohl einer skalaren als auch einer Array-basierten API zum Abrufen von Werten sowie die ordnungsgemäße Dekodierung von URI-Komponenten.

Tyson
quelle
7

Der einfachste Weg mit der replace()Methode:

Aus der urlStrZeichenfolge:

paramVal = urlStr.replace(/.*param_name=([^&]*).*|(.*)/, '$1');

oder von der aktuellen URL :

paramVal = document.URL.replace(/.*param_name=([^&]*).*|(.*)/, '$1');

Erläuterung:

  • document.URL - interface gibt den Dokumentspeicherort (Seiten-URL) als Zeichenfolge zurück.
  • replace()- Die Methode gibt eine neue Zeichenfolge zurück, bei der einige oder alle Übereinstimmungen eines Musters durch eine Ersetzung ersetzt werden .
  • /.*param_name=([^&]*).*/- das Muster der regulären Ausdrücke zwischen Schrägstrichen, was bedeutet:
    • .* - null oder mehr Zeichen,
    • param_name= - param Name, der serched ist,
    • () - Gruppe im regulären Ausdruck,
    • [^&]*- eines oder mehrere Zeichen mit Ausnahme von &,
    • | - Wechsel,
    • $1 - Verweis auf die erste Gruppe im regulären Ausdruck.

var urlStr = 'www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5';
var c = urlStr.replace(/.*c=([^&]*).*|(.*)/, '$1');
var notExisted = urlStr.replace(/.*not_existed=([^&]*).*|(.*)/, '$1');
console.log(`c === '${c}'`);
console.log(`notExisted === '${notExisted}'`);

simhumileco
quelle
1
Gute Lösung, aber wenn der Parameter nicht gefunden wird, wird die gesamte Zeichenfolge zurückgegeben. Ich würde in diesem Fall "undefiniert" erwarten.
Pensan
1
Hallo @pensan, danke für deinen tollen Kommentar. Ich füge dem regulären Ausdruck nur die Behandlung der Situation hinzu, in der der Parameter nicht in der URL angezeigt wird. In diesem Fall erhalten wir die leere Zeichenfolge (nicht die gesamte Zeichenfolge).
Simhumileco
6

Noch ein Vorschlag.

Es gibt bereits einige gute Antworten, aber ich fand sie unnötig komplex und schwer zu verstehen. Dies ist kurz, einfach und gibt ein einfaches assoziatives Array mit Schlüsselnamen zurück, die den Token-Namen in der URL entsprechen.

Ich habe unten eine Version mit Kommentaren für diejenigen hinzugefügt, die lernen möchten.

Beachten Sie, dass dies für die Schleife von jQuery ($ .each) abhängt, die ich anstelle von forEach empfehle. Ich finde es einfacher, die Cross-Browser-Kompatibilität mit jQuery auf der ganzen Linie sicherzustellen, als einzelne Fixes einzufügen, um die neuen Funktionen zu unterstützen, die in älteren Browsern nicht unterstützt werden.

Bearbeiten: Nachdem ich dies geschrieben habe, habe ich Eric Elliotts Antwort bemerkt, die fast dieselbe ist, obwohl sie für jeden verwendet wird, während ich generell dagegen bin (aus den oben genannten Gründen).

function getTokens(){
    var tokens = [];
    var query = location.search;
    query = query.slice(1);
    query = query.split('&');
    $.each(query, function(i,value){    
        var token = value.split('=');   
        var key = decodeURIComponent(token[0]);     
        var data = decodeURIComponent(token[1]);
        tokens[key] = data;
    });
    return tokens;
}

Kommentierte Version:

function getTokens(){
    var tokens = [];            // new array to hold result
    var query = location.search; // everything from the '?' onward 
    query = query.slice(1);     // remove the first character, which will be the '?' 
    query = query.split('&');   // split via each '&', leaving us an array of something=something strings

    // iterate through each something=something string
    $.each(query, function(i,value){    

        // split the something=something string via '=', creating an array containing the token name and data
        var token = value.split('=');   

        // assign the first array element (the token name) to the 'key' variable
        var key = decodeURIComponent(token[0]);     

        // assign the second array element (the token data) to the 'data' variable
        var data = decodeURIComponent(token[1]);

        tokens[key] = data;     // add an associative key/data pair to our result array, with key names being the URI token names
    });

    return tokens;  // return the array
}

Für die folgenden Beispiele nehmen wir diese Adresse an:

http://www.example.com/page.htm?id=4&name=murray

Sie können die URL-Token Ihrer eigenen Variablen zuweisen:

var tokens = getTokens();

Verweisen Sie dann auf jedes URL-Token mit folgendem Namen:

document.write( tokens['id'] );

Dies würde "4" drucken.

Sie können auch einfach direkt auf einen Token-Namen in der Funktion verweisen:

document.write( getTokens()['name'] );

... was "Murray" drucken würde.

Equazcion
quelle
6
// Read a page's GET URL variables and return them as an associative array.
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;
}

// Usage for URL: http://my.site.com/location?locationId=53cc272c0364aefcb78756cd&shared=false
var id = getUrlVars()["locationId"];

Von hier erhalten: http://jquery-howto.blogspot.ru/2009/09/get-url-parameters-values-with-jquery.html

Thezar
quelle
6

Einfacher Weg

function getParams(url){
        var regex = /[?&]([^=#]+)=([^&#]*)/g,
            params = {},
            match;
        while(match = regex.exec(url)) {
            params[match[1]] = match[2];
        }
        return params;
    }

dann nenne es wie getParams (url)

Sudhakar Reddy
quelle
5

Ich musste eine URL-GET-Variable lesen und eine Aktion basierend auf dem URL-Parameter ausführen. Ich suchte hoch und niedrig nach einer Lösung und stieß auf diesen kleinen Code. Es liest im Grunde die aktuelle Seiten-URL, führt einen regulären Ausdruck für die URL aus und speichert dann die URL-Parameter in einem assoziativen Array, auf das wir leicht zugreifen können.

Als Beispiel, wenn wir die folgende URL mit dem Javascript unten hatten.

http://TestServer/Pages/NewsArchive.aspx?year=2013&Month=July

Alles, was wir tun müssen, um die Parameter-ID und die Seite zu erhalten, ist Folgendes aufzurufen:

Der Code lautet:

<script type="text/javascript">
var first = getUrlVars()["year"];
var second = getUrlVars()["Month"];

alert(first);
alert(second);
function getUrlVars() {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
return vars;
}
</script>
Waseem Khan
quelle
Arbeitete für mich danke
OJB1
5
// http:localhost:8080/path?param_1=a&param_2=b
var getParamsMap = function () {
    var params = window.location.search.split("&");
    var paramsMap = {};
    params.forEach(function (p) {
        var v = p.split("=");
        paramsMap[v[0]]=decodeURIComponent(v[1]);
    });
    return paramsMap;
};

// -----------------------

console.log(getParamsMap()["param_1"]);  // should log "a"     
Wolf7176
quelle
Dies gibt den ersten Parameter mit '?'
Pini Cheyni
5

Dieser Kern von Eldon McGuinness ist bei weitem die vollständigste Implementierung eines JavaScript-Abfragezeichenfolgen-Parsers, den ich bisher gesehen habe.

Leider ist es als jQuery-Plugin geschrieben.

Ich habe es in Vanilla JS umgeschrieben und einige Verbesserungen vorgenommen:

function parseQuery(str) {
  var qso = {};
  var qs = (str || document.location.search);
  // Check for an empty querystring
  if (qs == "") {
    return qso;
  }
  // Normalize the querystring
  qs = qs.replace(/(^\?)/, '').replace(/;/g, '&');
  while (qs.indexOf("&&") != -1) {
    qs = qs.replace(/&&/g, '&');
  }
  qs = qs.replace(/([\&]+$)/, '');
  // Break the querystring into parts
  qs = qs.split("&");
  // Build the querystring object
  for (var i = 0; i < qs.length; i++) {
    var qi = qs[i].split("=");
    qi = qi.map(function(n) {
      return decodeURIComponent(n)
    });
    if (typeof qi[1] === "undefined") {
      qi[1] = null;
    }
    if (typeof qso[qi[0]] !== "undefined") {

      // If a key already exists then make this an object
      if (typeof (qso[qi[0]]) == "string") {
        var temp = qso[qi[0]];
        if (qi[1] == "") {
          qi[1] = null;
        }
        qso[qi[0]] = [];
        qso[qi[0]].push(temp);
        qso[qi[0]].push(qi[1]);

      } else if (typeof (qso[qi[0]]) == "object") {
        if (qi[1] == "") {
          qi[1] = null;
        }
        qso[qi[0]].push(qi[1]);
      }
    } else {
      // If no key exists just set it as a string
      if (qi[1] == "") {
        qi[1] = null;
      }
      qso[qi[0]] = qi[1];
    }
  }
  return qso;
}

// DEMO
console.log(parseQuery("?foo=bar&foo=boo&roo=bar;bee=bop;=ghost;=ghost2;&;checkbox%5B%5D=b1;checkbox%5B%5D=b2;dd=;http=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab&http=http%3A%2F%2Fw3schools2.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab"));

Siehe auch diese Geige .

John Slegers
quelle
Was ich über Javascript nicht verstehe, ist, warum sie keine URL-Analysefunktionen erstellt und in die Sprache selbst oder zumindest in eine Standardbibliothek eingefügt haben. Low-Level-Inhalte sollten nicht immer wieder neu erfunden werden und den Entwicklern nicht überlassen bleiben, welche entropisch varianten Lösungen sie entwickeln werden. Wenn dies solide ist, sollte so etwas in die Standardbibliothek aufgenommen werden. Dies ist ein Beispiel für die Art von Dingen in Javascript, die mich von der Sprache ablenken.
Ahnbizcad
5

Elegante, funktionale Lösung

Erstellen wir ein Objekt, das URL-Parameternamen als Schlüssel enthält, und extrahieren den Parameter dann einfach anhand seines Namens:

// URL: https://example.com/?test=true&orderId=9381  

// Build an object containing key-value pairs
export const queryStringParams = window.location.search
  .split('?')[1]
  .split('&')
  .map(keyValue => keyValue.split('='))
  .reduce<QueryStringParams>((params, [key, value]) => {
    params[key] = value;
    return params;
  }, {});

type QueryStringParams = {
  [key: string]: string;
};


// Return URL parameter called "orderId"
return queryStringParams.orderId;

quelle
Ich liebe das, aber es hat bei mir nicht funktioniert, ohne sicherzustellen, dass der Akku in der Reduktionsfunktion zurückgegeben wird
Ella
@ Ella es war ein Tippfehler, es gibt keine Möglichkeit, es kann ohne funktionierenreturn
Sieht jetzt besser aus, hoffen wir, dass Sie es auf die erste Seite schaffen!
Ella
4

Folgendes mache ich:

var uriParams = getSearchParameters();
alert(uriParams.c);


// background functions:

// Get object/associative array of URL parameters
function getSearchParameters () {
  var prmstr = window.location.search.substr(1);
  return prmstr !== null && prmstr !== "" ? transformToAssocArray(prmstr) : {};
}

// convert parameters from url-style string to associative array
function transformToAssocArray (prmstr) {
  var params = {},
      prmarr = prmstr.split("&");

  for (var i = 0; i < prmarr.length; i++) {
    var tmparr = prmarr[i].split("=");
    params[tmparr[0]] = tmparr[1];
  }
  return params;
}
Bobb Fwed
quelle