JavaScriptクエリ文字列[終了]


106

クエリ文字列やASP.NETスタイルから辞書を作成するJavaScriptライブラリはありますか?

次のように使用できるもの:

var query = window.location.querystring["query"]?

された「クエリ文字列は、」他の何か外と呼ばれる.NET領域?なぜキー/値コレクションにlocation.search分割されないのですか?

編集:私は自分の関数を書きましたが、主要なJavaScriptライブラリはこれを行いますか?


3
これが見つかりました:medialize.github.com/URI.js
deerchao



1
@davidtaubmannの方が古いので、逆になります。彼らが本質的に同じことを尋ねるのはおかしいですが、質問の形式により、1つは栄光がコミュニティのものになり、他は話題から外れました。
Andre Figueiredo 2018年

回答:


11

37
これはjqueryのネイティブである必要があります
gcb

@EvanMulawskiありがとう。プラグインが消えたようです。私は役立つかもしれない別のリンクを追加しました。
Shadow2531 2011年

CMSが提供する方法は、より簡単でクリーンです。特に jqueryをまだ使用していない場合。
jcoffland 2012

1
あなたはこのライブラリを参照してそれを行うことができます-github.com/Mikhus/jsurl
Mikhus

1
適切なリンクは次のとおり
object

230

location.searchプロパティからキーと値のペアを抽出できます。このプロパティには、?に続くURLの一部があります。記号、?シンボル。

function getQueryString() {
  var result = {}, queryString = location.search.slice(1),
      re = /([^&=]+)=([^&]*)/g, m;

  while (m = re.exec(queryString)) {
    result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
  }

  return result;
}

// ...
var myParam = getQueryString()["myParam"];

11
これは勝利ではありません。キーの値に「=」文字が含まれている場合はどうなりますか?例:dork.com/?equation=10=2。URLエンコードする必要があると主張することもできますが、そうである必要はありません。このような素朴な関数を自分で書き間違えたことがあります。この関数が説明するエッジケースは複数あります。
JamesBrownIsDead 2010年

6
@ジェームズ、数か月前に関数を変更したことを忘れていましたが、今では正しくサンプルを処理できますdork.com/?equation=10=2...
CMS

2
@CMSこれは、この?val=foo&val=bar&val=baz ように表されるクエリ文字列の配列の可能性を処理しません。これをどのように収容しますか?
Russ Bradberry 2010

2
@RussBradberry本当に持つことはできませんval=foo&val=bar&val=baz。それがなければならないであろうval[]=foo&val[]=bar&val[]=baz
ブライアン・ドリスコール

1
私の値にスペースがあり、varがで終わったとき、それは私には不完全に思えた%20ので、私は次のものに置き換えresult[keyValuePair[0]] = keyValuePair[1] || '';ましたresult[keyValuePair[0]] = decodeURIComponent((keyValuePair[1]+'').replace(/\+/g, '%20')) || '';
user24601

22

バニラJavaScriptを使用した単一行のコードに対するtl; drソリューション

var queryDict = {}
location.search.substr(1).split("&").forEach(function(item) {
    queryDict[item.split("=")[0]] = item.split("=")[1]
})

クエリ文字列の?a=1&b=2&c=3&d&e場合は次を返します:

> queryDict
a: "1"
b: "2"
c: "3"
d: undefined
e: undefined

多値キーエンコードされた文字

JavaScriptでクエリ文字列値を取得するにどうすればよいですか?

"?a=1&b=2&c=3&d&e&a=5&a=t%20e%20x%20t&e=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dståle%26car%3Dsaab"
> queryDict
a: ["1", "5", "t e x t"]
b: ["2"]
c: ["3"]
d: [undefined]
e: [undefined, "http://w3schools.com/my test.asp?name=ståle&car=saab"]

8
それは単一の行ではありません-正しくフォーマットされていない複数の行です!
JonnyRaa 2014年

1
くそー、私は何を言うべきかわからない...あなたは私を得た。ここで、いくつかの複数行の解決策があります: `var queryDict = {}; location.search.substr(1).split( "&")。forEach(function(item){queryDict [item.split( "=")[0]] = item.split( "=")[1]; }); `
Qwerty

2
ハハハハハハハ!申し訳ありませんが、「xを実行する1つのライナーを見つけた」と言っていた人と一緒に作業して、改行を取り除いて3行だけ表示しました。
JonnyRaa 2014年

@JonnyLeeds問題ありません、私はあなたが何を意味しているのか正確に知っていますが、それでは、なぜ連鎖コマンドのそれぞれを新しい行に書くのでしょうか?次に、パラメーターとして指定された関数(パラメーターは通常インライン化されます)があり、割り当ては1つだけです。インライン化するのは悲鳴!:D
Qwerty、2015年

1
@Qwerty、それはおそらくあなたの「ワンライナー」がそれを読むのに水平スクロールを必要としないように再フォーマットされるべきだからです。調整しました。
P私

8

この投稿を見つけた後、自分を見て、最も投票された解決策が最善ではないと私は付け加えるべきだと思いました。これは配列値を処理しません(?a = foo&a = barなど-この場合、aが['foo'、 'bar']を返すことを期待します)。また、私が知る限り、%20がスペースを表す16進文字エンコード(例:?a = Hello%20World)またはスペースを表すために使用されるプラス記号(例)のようなエンコードされた値は考慮されません。 :?a = Hello + World)。

Node.jsは、クエリ文字列解析に対する非常に完全なソリューションのように見えます。非常によく隔離されていて、許可されたライセンスの下にあるので、自分のプロジェクトで取り出して使用するのは簡単です。

そのコードはここで見ることができます: https //github.com/joyent/node/blob/master/lib/querystring.js

Nodeが持っているテストはここで見ることができます:https : //github.com/joyent/node/blob/master/test/simple/test-querystring.js私はそれらをいくつか見るために人気のある答えを試してみることをお勧めしますそれらを処理します。

この機能を具体的に追加するために私が携わったプロジェクトもあります。これは、Python標準libクエリ文字列解析モジュールのポートです。私のフォークはここにあります:https : //github.com/d0ugal/jquery.qeeree


Node、jsからコードを借用するだけではなく、高度に絡み合っています。
alfwatt 2014

5

または、ライブラリsugar.jsを使用することもできます

sugarjs.comから:

Object.fromQueryString(str、deep = true

URLのクエリ文字列をオブジェクトに変換します。deepがfalseの場合、変換は浅いパラメーター(つまり、[]構文のオブジェクトまたは配列なし)のみを受け入れます。これらは普遍的にサポートされていないためです。

Object.fromQueryString('foo=bar&broken=wear') >{"foo":"bar","broken":"wear"}
Object.fromQueryString('foo[]=1&foo[]=2') >{"foo":[1,2]}

例:

var queryString = Object.fromQueryString(location.search);
var foo = queryString.foo;

3

手元にクエリ文字列がある場合は、これを使用します。

 /**
 * @param qry the querystring
 * @param name name of parameter
 * @returns the parameter specified by name
 * @author eduardo.medeirospereira@gmail.com
 */

function getQueryStringParameter(qry,name){
    if(typeof qry !== undefined && qry !== ""){
        var keyValueArray = qry.split("&");
        for ( var i = 0; i < keyValueArray.length; i++) {
            if(keyValueArray[i].indexOf(name)>-1){
                return keyValueArray[i].split("=")[1];
            }
        }
    }
    return "";
}

2
// How about this
function queryString(qs) {
    var queryStr = qs.substr(1).split("&"),obj={};
    for(var i=0; i < queryStr.length;i++)
        obj[queryStr[i].split("=")[0]] = queryStr[i].split("=")[1];
    return obj;
}

// Usage:
var result = queryString(location.search);

これは多かれ少なかれ、上記で最も投票された回答の「更新:正規表現を使用する必要がない」コードと同じです。この質問には同様のコードがたくさんあります)。decodeURIComponent少なくとも、抽出された文字列がありません。
Rup

@Rup、更新はこの回答の後に行われました。
Qwerty

@Qwertyいいえ、そうではありませんでした。更新は2013年2月でしたが、この回答はほぼ1年後の2014年2月にありました。decodeURIComponentしかし、スタンドについての私のコメント。
Rup

@Rupうん、ごめんなさい。そしてうん。
Qwerty、2014年

2

注目に値します。JohnSlegersが言及したライブラリにはjQueryの依存関係がありますが、ここでは標準的なJavascriptのバージョンです。

https://github.com/EldonMcGuinness/querystring.js

私は彼の投稿にコメントするだけでよかったのですが、そうする評判はありません。:/

例:

以下の例では、不規則ではありますが、次のクエリ文字列を処理します。

?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 

var qs = "?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";
//var qs = "?=&=";
//var qs = ""

var results = querystring(qs);

(document.getElementById("results")).innerHTML =JSON.stringify(results, null, 2);
<script 
src="https://rawgit.com/EldonMcGuinness/querystring.js/master/dist/querystring.min.js"></script>
<pre id="results">RESULTS: Waiting...</pre>


実際、私は自分の回答で与えたコードのjQuery依存関係を削除しました;-)
John Slegers

2

コード

エルドン・マクギネスによるこの要旨は、これまで見てきたJavaScriptクエリ文字列パーサーの最も完全な実装です。

残念ながら、それはjQueryプラグインとして書かれています。

私はそれをバニラJSに書き直して、いくつかの改良を加えました:

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

どうやって使うのですか

var results = 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");

出力

{
  "foo": ["bar", "boo" ],
  "roo": "bar",
  "bee": "bop",
  "": ["ghost", "ghost2"],
  "checkbox[]": ["b1", "b2"],
  "dd": null,
  "http": [
    "http://w3schools.com/my test.asp?name=ståle&car=saab",
    "http://w3schools2.com/my test.asp?name=ståle&car=saab"
  ]
}

このフィドルも参照してください。


1

function decode(s) {
    try {
        return decodeURIComponent(s).replace(/\r\n|\r|\n/g, "\r\n");
    } catch (e) {
        return "";
    }
}
function getQueryString(win) {
    var qs = win.location.search;
    var multimap = {};
    if (qs.length > 1) {
        qs = qs.substr(1);
        qs.replace(/([^=&]+)=([^&]*)/g, function(match, hfname, hfvalue) {
            var name = decode(hfname);
            var value = decode(hfvalue);
            if (name.length > 0) {
                if (!multimap.hasOwnProperty(name)) {
                    multimap[name] = [];
                }
                multimap[name].push(value);
            }
        });
    }
    return multimap;
}
var keys = getQueryString(window);
for (var i in keys) {
    if (keys.hasOwnProperty(i)) {
        for (var z = 0; z < keys[i].length; ++z) {
            alert(i + ":" + keys[i][z]);
        }
    }
}

hfnameの照合で大文字と小文字を区別しない場合は、名前を.toLowerCase()にすることもできます。
Shadow2531 2009年

値が空かどうかを確認することもできます。そうである場合、配列に空でない値のみが含まれるように、エントリの追加をスキップできます。
Shadow2531 2009年

1
unescape()はUTF-8シーケンスを処理しないため、decodeURIComponent()を使用することをお勧めします。ただし、+文字をスペースにデコードする場合は、デコードする前に文字列に対して.replace(/ \ + / g、 "")を実行します。
Shadow2531 2009年

1

私はそれをシンプルで、読みやすく、小さく保つのが好きです。

function searchToObject(search) {
    var pairs = search.substring(1).split("&"),
        obj = {}, pair;

    for (var i in pairs) {
        if (pairs[i] === "") continue;
        pair = pairs[i].split("=");
        obj[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
    }
    return obj;
}

searchToObject(location.search);

例:

searchToObject('?query=myvalue')['query']; // spits out: 'myvalue'

1

純粋なjavascript文字列操作を使用して、これに類似した要件のために作成した関数

"http://www.google.lk/?Name=John&Age=20&Gender=Male"

function queryize(sampleurl){
    var tokens = url.split('?')[1].split('&');
    var result = {};

    for(var i=0; i<tokens.length; i++){
        result[tokens[i].split('=')[0]] = tokens[i].split('=')[1];
    }

    return result;
}

使用法:

queryize(window.location.href)['Name'] //returns John
queryize(window.location.href)['Age'] //returns 20
queryize(window.location.href)['Gender'] //returns Male

きちんとしているが、?基本的にあなたの上の2つの答えと同じであるリーディングを削除する方法を除いて?
Rup

ほんの小さな改善。このメソッドの使用方法は、ユーザーにとって簡単です。ユーザーは、必要なクエリ文字列値を知っているだけです。
Pranavan Maru 2014

1

lodash + ES6を使用している場合、1行の解決策を次に示します。 _.object(window.location.search.replace(/(^\?)/, '').split('&').map(keyVal => keyVal.split('=')));


0

さて、誰もが私の実際の質問を無視しているので、えっと、私も私のものを投稿します!ここに私が持っているものがあります:

location.querystring = (function() {

    // The return is a collection of key/value pairs

    var queryStringDictionary = {};

    // Gets the query string, starts with '?'

    var querystring = unescape(location.search);

    // document.location.search is empty if no query string

    if (!querystring) {
        return {};
    }

    // Remove the '?' via substring(1)

    querystring = querystring.substring(1);

    // '&' seperates key/value pairs

    var pairs = querystring.split("&");

    // Load the key/values of the return collection

    for (var i = 0; i < pairs.length; i++) {
        var keyValuePair = pairs[i].split("=");
        queryStringDictionary[keyValuePair[0]] = keyValuePair[1];
    }

    // Return the key/value pairs concatenated

    queryStringDictionary.toString = function() {

        if (queryStringDictionary.length == 0) {
            return "";
        }

        var toString = "?";

        for (var key in queryStringDictionary) {
            toString += key + "=" + queryStringDictionary[key];
        }

        return toString;
    };

    // Return the key/value dictionary

    return queryStringDictionary;
})();

そしてテスト:

alert(window.location.querystring.toString());

for (var key in location.querystring) {
    alert(key + "=" + location.querystring[key]);
}

JavaScriptは私の母国語ではありません。

とにかく、すでに記述されているJavaScriptライブラリ(jQuery、Prototypeなど)を探しています。:)


1
上記の3行のコードに相当するライブラリを本当に必要としているとは思いません。それでも、少なくとも、ライブラリが、これまでに投稿されたすべてのコードスニペットで失敗した、キーと値の両方のdecodeURIComponent()を記憶することを願っています。
ボビンス2009年

ライブラリは必要ありません。実装をライブラリ内の実装と比較して、エッジケースがないかどうかを確認したかったのです。:)
コア

javascriptはあなたの母国語ではないのですが、ライブラリを使用する必要がある場合でも学習する必要があります
Marwan

0

@CMSの回答に基づいて、私は次のようにしています(CoffeeScriptで簡単にJavaScriptに変換できます)。

String::to_query = ->
  [result, re, d] = [{}, /([^&=]+)=([^&]*)/g, decodeURIComponent]
  while match = re.exec(if @.match /^\?/ then @.substring(1) else @)
    result[d(match[1])] = d match[2] 
  result

あなたは簡単にあなたが必要なものをつかむことができます:

location.search.to_query()['my_param']

ここでの利点は、(機能ではなく)オブジェクト指向のインターフェイスであり、(location.searchだけでなく)任意の文字列に対して実行できます。

JavaScriptライブラリを既に使用している場合、この関数はすでに存在しています。たとえば、これはプロトタイプのバージョンです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.