2012-08-04 8 views
6

Necesito construir un enrutador, que enruta una solicitud REST a un controlador y una acción correctos. Aquí algunos ejemplos:Javascript routing regex

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

Es importante tener una sola expresión regular y tan bueno como sea posible ya que el enrutamiento es esencial y hecho en cada petición.

primero tenemos que reemplazar: (hasta el final o hasta la próxima barra inclinada /) en las direcciones URL con una expresión regular, que luego podemos utilizar para validar la URL con la URL de solicitud.

¿Cómo podemos reemplazar estos enrutamientos dinámicos con regex? Al igual que la búsqueda de una cadena que comienza con ":" y termina con "/", final de cadena o "&".

Esto es lo que he intentado:

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

Por alguna razón no funciona. ¿Cómo podría implementar una expresión regular que reemplace: id con una expresión regular, o simplemente ignorarlos al comparar con la url de solicitud real?

Gracias por la ayuda

Respuesta

12

que haría uso de :[^\s/]+ para hacer coincidir los parámetros que empiezan con dos puntos (partido :, entonces tantos caracteres como sea posible, excepto / y espacios en blanco).

Como reemplazo, estoy usando ([\\w-]+) para que coincida con cualquier carácter alfanumérico, - y _, en un grupo de captura, dado que está interesado en utilizar los parámetros coincidentes también.

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

Creo que falta el subrayado (_) en '([\\ w -] +)'? –