Regexp#exec
は、とても良いインターフェイスではありませんが、安全です。
サイドベット:あなたは、この機能は吸うと思いますし、より良いオプションは、これは使用しません:)
yeeep
param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
:-)共有することを躊躇しないで持っている場合a g
ロバール正規表現ですので、各ブラケットのインスタンスを1つだけ置き換えることになります。 field[][]
は機能しません。また、文字グループは必要ありません... param.replace(/\[/g, '\\[')
はうまくいきました。あるいは、正規表現でない置換イディオム、param.split('[').join('\\[')
。その後
:
var regexS = "[\\?&]"+param+"=([^&#]*)";
あなたは正規表現にそれらをドロップすると、彼らのリテラルの自己を意味し持つことができることはほぼ十分な文字をエスケープしていません。水密的な代替方法については、this questionを参照してください。
とにかくこの種の正規表現のハッキングは、URL /クエリ文字列を解析するのには適していません。これは、;
または%
のエンコーディング、または+
のスペースでは適切に処理されず、URL内の他の場所でパラメータのルックアライメントを実行する可能性があります。
代わりに、最初にクエリ文字列を取得しましょう。リンクオブジェクトまたは位置オブジェクトがある場合は、.search
プロパティから取得できます。あなたが唯一の文字列のURLを持っている場合、あなたは確実にこれを取得するには、リンクオブジェクトにそれを回すことができます。
function getQueryString(url) {
var a= document.createElement('a');
a.href= url;
return a.search;
}
を今、あなたはその後、URLを落とし、&
または;
上の主要な?
、分割をドロップすることによってにそれを解析することができますあなたが必要としない場合は
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
:
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;
}
これは、パラメータを検索することが容易になります:JSオブジェクトに結果を復号されパラメータの複数の値を読み取る場合は、if...[]...push
ダンスの代わりにlookup[name]= value
を実行して、リストの代わりにルックアップで単一の文字列値を返すことができます。
'exec'呼び出しはコードを実行しません。なぜこれが安全でないのか分かりません。 – Amy
は私にとっては安全だと思われますが、 '.exec'は単にそれを変更するのをやめてください。 – Ibu