2012-08-04 34 views
6

Tôi cần xây dựng một bộ định tuyến, định tuyến một yêu cầu REST tới một bộ điều khiển và hành động chính xác. Dưới đây là một số ví dụ:Định tuyến Javascript regex

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

Điều quan trọng là phải có một biểu thức chính quy và tốt nhất có thể vì định tuyến là cần thiết và được thực hiện theo mọi yêu cầu.

trước tiên chúng ta phải thay thế: (cho đến khi kết thúc hoặc cho đến khi dấu gạch chéo tiếp theo /) trong url bằng regex, sau đó chúng tôi có thể sử dụng để xác thực url với url yêu cầu.

Làm cách nào chúng tôi có thể thay thế các định tuyến động này bằng regex? Giống như tìm kiếm chuỗi bắt đầu bằng ":" và kết thúc bằng "/", kết thúc chuỗi hoặc "&".

Đây là những gì tôi đã cố gắng:

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

Đối với một số lý do nó không hoạt động. Làm thế nào tôi có thể thực hiện một regex thay thế: id với regex, hoặc chỉ bỏ qua chúng khi so sánh với url yêu cầu thực.

Nhờ sự giúp đỡ

Trả lời

12

Tôi muốn sử dụng :[^\s/]+ cho phù hợp với các thông số bắt đầu với dấu hai chấm (trận đấu :, sau đó là nhiều nhân vật càng tốt trừ / và khoảng trắng).

Khi thay thế, tôi đang sử dụng ([\\w-]+) để khớp với bất kỳ ký tự chữ và số, -_, trong nhóm chụp, bạn cũng quan tâm đến việc sử dụng các thông số phù hợp.

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

Tôi nghĩ dấu gạch chân (_) bị thiếu trong '([\\ w -] +)'? –