2012-08-04 85 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