Regexp#exec 是安全的,虽然不是一个很好的界面。
赌注:如果您认为此功能很糟糕并且有更好的选择,请不要犹豫分享:)
耶 :-)
param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
这不使用global 正则表达式,因此您只需替换每个括号的一个实例; field[][] 不起作用。此外,您不需要字符组...param.replace(/\[/g, '\\[') 会起作用。或者,非正则表达式替换习语,param.split('[').join('\\[')。
然后:
var regexS = "[\\?&]"+param+"=([^&#]*)";
您没有转义足够多的字符,无法将它们放入正则表达式并让它们表示它们的字面意义。请参阅this question 以获得更防水的替代方案。
无论如何,这种正则表达式黑客仍然不是解析 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 舞蹈,以在查找而不是列表中返回单个字符串值。