8

我需要构建一个路由器,将 REST 请求路由到正确的控制器和操作。这里有一些例子:

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

拥有一个尽可能好的正则表达式很重要,因为路由是必不可少的,并且在每次请求时都会完成。

我们首先必须用正则表达式替换 url 中的 : (直到结束或直到下一个正斜杠 /),然后我们可以用它来验证带有请求 url 的 url。

我们如何用正则表达式替换这些动态路由?就像搜索以“:”开头并以“/”结尾的字符串、字符串结尾或“&”一样。

这是我尝试过的:

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

由于某种原因,它不起作用。我如何实现一个用正则表达式替换 :id 的正则表达式,或者在与真实请求 url 进行比较时忽略它们。

感谢帮助

4

1 回答 1

17

我将:[^\s/]+用于匹配以冒号开头的参数(匹配:,然后是尽可能多的字符,除了/空格)。

作为替换,我([\\w-]+)用来匹配任何字母数字字符,-并且_在捕获组中,假设您也对使用匹配的参数感兴趣。

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

console.log(url.match(routeMatcher))
于 2012-08-04T15:03:59.697 回答