1

我在网上找到了以下JS。

这是一个获取 url 参数值的函数。

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 的字符串。

4

3 回答 3

4

.exec()您在函数中看到的不是窗口而是对象RegExp

所以使用起来完全没问题。

于 2011-08-04T20:23:06.597 回答
3

我不会将 Regexpexeceval. 有点笨重,但它应该工作。

于 2011-08-04T20:25:06.643 回答
2

Regexp#exec是安全的,虽然不是一个很好的界面。

附带赌注:如果您认为此功能很糟糕并且有更好的选择,请不要犹豫分享 :)

耶:-)

param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");

这不使用global 正则表达式,因此您只需替换每个括号的一个实例;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跳舞,在查找而不是列表中返回单个字符串值。

于 2011-08-04T21:47:03.720 回答