Regexp#exec
非常に優れたインターフェースではありませんが、安全です。
副次的な賭け: この機能が最悪で、より良いオプションがあると思われる場合は、遠慮なく共有してください :)
うん:-)
param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
これはローバル正規表現を使用しないため、g
各ブラケットの 1 つのインスタンスのみを置き換えます。field[][]
うまくいきません。また、キャラクターグループは必要ありません...param.replace(/\[/g, '\\[')
うまくいったでしょう。または、非正規表現の置換イディオムparam.split('[').join('\\[')
.
それで:
var regexS = "[\\?&]"+param+"=([^&#]*)";
それらを正規表現にドロップして、文字通りの自己を意味させることができるほど十分な文字をエスケープしていません。より水密な代替手段については、この質問を参照してください。
とにかく、この種の正規表現ハッキングは、依然として URL/クエリ文字列を解析する良い方法ではありません. ;
これは、または%
-encoding、または+
スペースを適切に処理しません。また、URL の他の場所でパラメーターが類似している場合にトリップする可能性があります。
代わりに、最初にクエリ文字列を単独で取得しましょう。リンクまたはロケーション オブジェクトがある場合は、.search
プロパティから取得できます。文字列 URL しかない場合は、それをリンク オブジェクトに変換して、これを確実に取得できます。
function getQueryString(url) {
var a= document.createElement('a');
a.href= url;
return a.search;
}
これで、先頭の をドロップし、または?
で分割してから、URL でデコードされた結果を JS オブジェクトにドロップすることで解析できます。&
;
function parseQuery(query) {
var lookup= {};
var params= query.slice(1).split(/[&;]/);
for (var i= 0; i<params.length; i++) {
var ix= params[i].indexOf('=');
if (ix!==-1) {
var name= decodeURIComponent(params[i].slice(0, ix));
var value= decodeURIComponent(params[i].slice(ix+1));
if (!(name in lookup))
lookup[name]= [];
lookup[name].push(value);
}
}
return lookup;
}
これにより、パラメータを簡単に検索できます。
var url= 'http://www.example.com/?a=b&c=d&c=%65;f[]=g#h=i';
var pars= parseQuery(getQueryString(url));
alert(pars.a); // ['b']
alert(pars.c); // ['d', 'e']
alert(pars['f[]']); // ['g']
alert('h' in pars); // false
パラメータの複数の値を読み取る必要がない場合lookup[name]= value
は、if...[]...push
ダンスの代わりに、リストではなくルックアップで単一の文字列値を返すことができます。