2012-08-04 86 views
6

我需要構建一個路由器,它將REST請求路由到正確的控制器和操作。這裏是一些例子:Javascript路由正則表達式

POST /users 
GET /users/:uid 
GET /users/search&q=lol 
GET /users 
GET /users/:uid/pictures 
GET /users/:uid/pictures/:pid 

重要的是有一個正則表達式和儘可能好的,因爲路由是必不可少的,在每個請求完成。

我們首先必須用正則表達式替換:(直到結束或直到下一個正斜槓/),然後我們才能使用請求url驗證url。

我們如何用正則表達式替換這些動態路由?如搜索以「:」開頭並以「/」結尾的字符串,字符串結尾或「&」。

這是我的嘗試:

var fixedUrl = new RegExp(url.replace(/\\\:[a-zA-Z0-9\_\-]+/g, '([a-zA-Z0-0\-\_]+)')); 

出於某種原因,這是行不通的。我怎麼能實現一個正則表達式,用正則表達式替換:id,或者在與真正的請求url比較時忽略它們。

感謝您的幫助

回答

12

我會使用:[^\s/]+匹配開始冒號(比賽:,然後儘可能多的字符可能除了/和空格)參數。

作爲替代,我使用([\\w-]+)到,匹配任何字母數字字符,-_,在捕獲組給你有興趣使用匹配的參數也是如此。

var route = "https://stackoverflow.com/users/:uid/pictures"; 
var routeMatcher = new RegExp(route.replace(/:[^\s/]+/g, '([\\w-]+)')); 
var url = "https://stackoverflow.com/users/1024/pictures"; 

console.log(url.match(routeMatcher)) 
+1

我認爲'([\\ w - ] +)'中缺少下劃線(_)? – 2016-09-26 14:36:26