我建议使用替代正则表达式,使用子组单独捕获参数的名称和值:
function getUrlParams(url) {
var re = /(?:\?|&(?:amp;)?)([^=]+)(?:=?([^]*))/g,
match, params = {},
decode = function (s) {return decodeURIComponent(s.replace(/\+/g, " "));};
if (typeof url == "undefined") url = document.location.href;
while (match = re.exec(url)) {
params[decode(match[1])] = decode(match[2]);
}
return params;
}
var result = getUrlParams("http://maps.google.de/maps?f=q&source=s_q&hl=de&geocode=&q=Frankfurt+am+Main&sll=50.106047,8.679886&sspn=0.370369,0.833588&ie=UTF8&ll=50.116616,8.680573&spn=0.35972,0.833588&z=11&iwloc=addr");
result 是一个对象:
{
f:“q”
地理编码:“”
hl:“de”
即:“UTF8”
iwloc:“addr”
ll:“50.116616,8.680573”
问:“美因河畔法兰克福”
sll:“50.106047,8.679886”
来源:“s_q”
spn:“0.35972,0.833588”
sspn:“0.370369,0.833588”
z:“11”
}
正则表达式分解如下:
(?:#非捕获组
\?|&#“?” 要么 ”&”
(?:放大器;)?#(对于错误的HTML编码的网址,请允许“&”)
)#end非捕获组
(#组1
[^ =&#] +#除“=”,“&”或“#”之外的任何字符; 至少一次
)#end end 1 - 这将是参数的名称
(?:#非捕获组
=?#an“=”,可选
(#组2
[^&#] *#除“&”或“#”之外的任何字符; 任何次数
)#end end 2 - 这将是参数的值
)#end非捕获组