私は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を入力すると、対応する関数名が返されます(文字列を関数として呼び出す方法を理解する必要があります)。問題は、私の例のように非常によく似た2つのルートがある場合、正規表現が両方に一致することです。上記の例では、理想的には2番目のルートのみを一致させたいのですが、もちろん最初のルートも一致するため、残念ながら両方が一致します。
正規表現が完全一致のみを返すようにする方法はありますか?入力URLのスラッシュをカウントし、スラッシュの数が一致するルートのみを呼び出すという別の解決策がありますが、これはかなりエレガントではないようです。