106

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

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

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

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

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

4

15 に答える 15

232

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"];
于 2009-03-15T04:08:10.937 に答える
11

多分http://plugins.jquery.com/query-object/ ?

これはhttps://github.com/sousk/jquery.parsequery#readmeのフォークです。

于 2009-03-15T05:33:54.320 に答える
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

ノードが持っているテストはここで見ることができます : https://github.com/joyent/node/blob/master/test/simple/test-querystring.jsそれらを処理します。

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

于 2011-11-20T17:50:47.763 に答える
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 "";
}
于 2012-05-03T18:48:21.603 に答える
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);
于 2014-02-16T17:46:27.840 に答える
2

John Slegers が言及したライブラリには jQuery 依存関係があることに注意してください。

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>

于 2016-02-21T21:53:49.860 に答える
1

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

于 2015-12-10T21:34:57.883 に答える
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]);
        }
    }
}
于 2009-03-15T05:02:03.163 に答える
0

@CMSによる回答に基づいて、次のものがあります(JavaScriptに簡単に変換できるCoffeeScriptにあります):

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 ライブラリを使用している場合、この関数は既に存在するようにします。たとえば、ここにプロトタイプのバージョンがあります

于 2012-10-17T19:16:26.383 に答える
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 など) を探しています。:)

于 2009-03-15T04:14:52.107 に答える