我在网上找到了以下JS。
这是获取url params值的函数。
function get_url_param(param) {
param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regexS = "[\\?&]"+param+"=([^&#]*)";
var regex = new RegExp( regexS );
var results = regex.exec(window.location.href);
if( results == null )
return '';
else
return results[1];
}
但是,当我看到exec()
函数时,我想:Eeek!
所以我的问题是:它安全吗?
边注:如果你认为这个功能很糟糕并有更好的选择,请不要犹豫分享:)
上面的函数使用了真实的url,但我只需要解析一个包含URL的字符串。
答案 0 :(得分:4)
您在函数中看到的.exec()
不是窗口,而是RegExp
对象。
所以使用起来非常好。
答案 1 :(得分:3)
我不会将正则表达式exec
与eval
混淆。有点笨重,但它应该工作。
答案 2 :(得分:2)
Regexp#exec
是安全的,虽然不是一个非常好的界面。
边注:如果你认为这个功能很糟糕并有更好的选择,请不要犹豫分享:)
yeeep: - )
param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
这不使用g
lobal正则表达式,因此您只替换每个括号的一个实例; field[][]
不起作用。此外,您不需要角色组...... param.replace(/\[/g, '\\[')
会有效。或者,非正则表达式替换习语param.split('[').join('\\[')
。
然后:
var regexS = "[\\?&]"+param+"=([^&#]*)";
你并没有逃避足够多的角色,无法将它们放入正则表达式,让它们意味着自己的文字自我。有关更加防水的替代方案,请参阅this question。
无论如何,这种正则表达式黑客攻击仍然不是解析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
舞蹈,以在查找中返回单个字符串值而不是列表。