http://safalra.com/web-design/javascript/parsing-query-strings/の parseQueryString にはいくつかのバグがあります。
- 複数
+
の はスペースに置き換えられません。
- エスケープされていない等号が複数あると、コンテンツが失われます。
- 空の入力は、キー "" を持つオブジェクトになります。
- 複数の空のキーは破棄されません
以下の関数では、上記のバグが削除され、Firefox 3、Internet Explorer 7、Opera 9、および Google Chrome 1 でテストされています。
function parseQueryString(input){
var out={}, decode=decodeURIComponent, s=input||location.search||"",
kv=("?"===s.charAt(0)?s.slice(1):s).replace(/\+/g," ").split(/[&;]/g),
idx=-1,key,value;
while(++idx<kv.length){
if (kv[idx]==="") continue;
value=kv[idx].split("=");
key=decode(value.shift());
(out[key]||(out[key]=[])).push(decode(value.join("=")));
}
return out;
}
上記の関数 (および元の関数) は、URLのクエリ部分 (疑問符から文字列の末尾または最初の # まで) のみを想定しています。引数が指定されていない場合、ブラウザの現在の場所の URL からクエリ部分が自動的に抽出されます。
結果はクエリ文字列からのキーを持つオブジェクトであり、すべてのキーの値はすべての値の配列です。
var data = parseQueryString("?a=test1&a=test2&b=test3");
//Result of data:
{
a:["test1","test2"],
b:["test3"]
}
いくつかの例:
// Alert all values of the a key:
if (data.a && data.a.length) {
for (var i=0;i<data.a.length;++i)
alert(data.a[i]);
}
// Get the first value of a-key:
var value_a = data.a && data.a[0];
// Get the first value of a-key or default:
var value_a = data.a && data.a[0] || "default";