クエリ文字列やASP.NET
スタイルから辞書を作成するJavaScriptライブラリはありますか?
次のように使用できるもの:
var query = window.location.querystring["query"]?
された「クエリ文字列は、」他の何か外と呼ばれる.NET
領域?なぜキー/値コレクションにlocation.search
分割されないのですか?
編集:私は自分の関数を書きましたが、主要なJavaScriptライブラリはこれを行いますか?
クエリ文字列やASP.NET
スタイルから辞書を作成するJavaScriptライブラリはありますか?
次のように使用できるもの:
var query = window.location.querystring["query"]?
された「クエリ文字列は、」他の何か外と呼ばれる.NET
領域?なぜキー/値コレクションにlocation.search
分割されないのですか?
編集:私は自分の関数を書きましたが、主要なJavaScriptライブラリはこれを行いますか?
回答:
多分http://plugins.jquery.com/query-object/?
これはhttps://github.com/sousk/jquery.parsequery#readmeのフォークです。
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"];
dork.com/?equation=10=2
...
?val=foo&val=bar&val=baz
ように表されるクエリ文字列の配列の可能性を処理しません。これをどのように収容しますか?
val=foo&val=bar&val=baz
。それがなければならないであろうval[]=foo&val[]=bar&val[]=baz
%20
ので、私は次のものに置き換えresult[keyValuePair[0]] = keyValuePair[1] || '';
ましたresult[keyValuePair[0]] = decodeURIComponent((keyValuePair[1]+'').replace(/\+/g, '%20')) || '';
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"]
この投稿を見つけた後、自分を見て、最も投票された解決策が最善ではないと私は付け加えるべきだと思いました。これは配列値を処理しません(?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
または、ライブラリ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;
手元にクエリ文字列がある場合は、これを使用します。
/**
* @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 "";
}
// 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
しかし、スタンドについての私のコメント。
注目に値します。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>
エルドン・マクギネスによるこの要旨は、これまで見てきた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"
]
}
このフィドルも参照してください。
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]);
}
}
}
私はそれをシンプルで、読みやすく、小さく保つのが好きです。
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'
純粋な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つの答えと同じであるリーディングを削除する方法を除いて?
さて、誰もが私の実際の質問を無視しているので、えっと、私も私のものを投稿します!ここに私が持っているものがあります:
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など)を探しています。:)
@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ライブラリを既に使用している場合、この関数はすでに存在しています。たとえば、これはプロトタイプのバージョンです