2012-08-04 15 views
6

Potrzebuję zbudować router, który kieruje żądanie REST do odpowiedniego kontrolera i akcji. Oto kilka przykładów:Rutowanie JavaScript regex

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

Ważne jest, aby mieć pojedynczy wyrażenie regularne i tak dobre, jak to możliwe, ponieważ routing jest niezbędna i zrobione na każde żądanie.

Najpierw musimy zastąpić: (do końca lub do następnego ukośnika /) w adresach URL za pomocą wyrażenia regularnego, które następnie możemy wykorzystać do sprawdzenia adresu URL za pomocą adresu URL żądania.

Jak możemy zastąpić te dynamiczne trasy za pomocą wyrażenia regularnego? Podobnie jak wyszukiwanie łańcucha rozpoczynającego się od ":" i kończącego się na "/", koniec łańcucha lub "&".

To co próbowałem:

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

Z jakiegoś powodu nie działa. W jaki sposób mogę zaimplementować wyrażenie regularne, które zastępuje: id z wyrażeniem regularnym, lub po prostu ignoruje je w porównaniu z rzeczywistym adresem URL żądania.

Dzięki za pomoc

Odpowiedz

12

użyję :[^\s/]+ dopasowywania parametrów zaczynające się dwukropkiem (mecz :, to tyle znaków, jak to możliwe, z wyjątkiem / i spacji).

jako zamiennik używam ([\\w-]+) dopasować dowolny znak alfanumeryczny, - i _ w grupie przechwytywania, biorąc pod uwagę, że jesteś zainteresowany wykorzystaniem jak dobrze dobrane parametry.

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

Myślę, że podkreślenia (_) brakuje w '([\\ w -] +)'? –

Powiązane problemy