我需要从url路径中提取参数名称。 参数在{}内或跟在第一个?(问号)或跟随&在网址上标记。
需要提取的url路径采用以下格式:
/tt/{pa}/{pb}/?p1=9888&p2=9&p3=98
因此参数为pa
,pb
,p1
,p1
,p3
答案 0 :(得分:2)
我能想到的最快方式是:
[{?&][^}=]+
现在我也抓住了前面的{
或?
或&
字符,所以你不得不在之后删除它:
var inp = '/tt/{pa}/{pb}/?p1=9888&p2=9&p3=98'
var found = inp.match(/[{?&][^}=]+/g).map(function(p){ return p.substring(1); });
document.write(found.join('<br />'));
&#13;
如果您希望/tt/{pa=}/{pb}/?p1={9888&p2=9&p3=98
之类的内容pa=
是有效的参数名称和/或{9888
是有效值,那么您就会陷入困境。但我怀疑这是一个严重的限制。
答案 1 :(得分:0)
从路径中单独提取搜索变量和变量的简单示例:
function extractSearch(search) {
var result = {};
search = search || window.location.search;
if (search.length) {
search = search.substr(1).split('&');
for (var i = 0; i < search.length; i++) {
search[i] = search[i].split('=');
result[decodeURIComponent(search[i][0])] = decodeURIComponent(search[i][1]);
}
}
return result;
}
function extractFromPath(pattern, url) {
var keys = [],
result = {},
i;
url = url || window.location.pathname;
pattern = pattern.replace(/{([^}]+)}/g, function($0, $1) {
keys.push($1);
return '([^/]+)';
});
pattern = url.match(new RegExp('^' + pattern));
for (i = 0; i < keys.length; i++) {
result[keys[i]] = pattern[i + 1];
}
return result;
}
使用示例:
// Object {a: "10", b: "20"}
extractSearch('?a=10&b=20');
// Object {pa: "1", pb: "2"}
extractFromPath('/tt/{pa}/{pb}', '/tt/1/2/?p1=9888&p2=9&p3=98');
最终你可以将它结合起来:
function getParameters(pattern, path) {
var result,
tmp;
path = path.split('?');
result = extractFromPath(pattern, path[0]);
if (path[1] !== void 0) {
tmp = extractSearch('?' + path[1]);
for (var param in tmp) {
result[param] = tmp[param];
}
}
return result;
}
// Object {pa: "1", pb: "2", a: "10", b: "20"}
getParameters('/tt/{pa}/{pb}', '/tt/1/2?a=10&b=20');