我正在考虑在 javaScript 中构建一个超级简单的路由器......到目前为止我有这个:
var match,routeMatcher,p;
var routes = {
"/users/:uid/pictures/:uid" : "userpictures",
"/users/:uid" : "user"
};
var url = "/users/1024/pictures/456";
for(var i in routes) {
//need to cache this regex
routeMatcher = new RegExp(i.replace(/:[^\s/]+/g, '([\\w-]+)'));
if(url.match(routeMatcher)) {
match = url.match(routeMatcher);
p = routes[i];
console.log(p);
}
}
这是一个小提琴http://jsfiddle.net/D6txe/
这行得通。当我输入像“users/1000”这样的 url 时,我会返回相应的函数名称(现在只需弄清楚如何将字符串作为函数调用)。问题是如果我有两条非常相似的路线,就像我的示例中的正则表达式匹配两者一样。在上面的示例中,理想情况下,我只希望匹配第二条路线,但不幸的是两者都匹配,因为当然第一条路线也是匹配的。
有什么办法可以让正则表达式只返回完全匹配?我有另一个解决方案,它涉及计算输入 url 中的正斜杠,并且只调用具有匹配数量的正斜杠的路由......但这似乎相当不雅。