Регулярное выражение Javascript с несколькими условиями
Я использую модуль Nginx njs для некоторых модификаций URL.
Мой вариант использования - вернуть uri перенаправления для данного uri.
URI будет следующим:
/books
/books/economic-genious
/books/flight-mechanics
Мое регулярное выражение, соответствующее указанному выше URI, выглядит следующим образом:
/books/(.*)|/books$
Первая часть выражения /books/(.*)
должен соответствовать ниже URI:
/books/economic-genious
/books/flight-mechanics
Вторая часть выражения /books$
должен соответствовать ниже URI:
/books
Мой пункт назначения настроен следующим образом: /ebooks/$1
. Таким образом, указанный выше URI будет преобразован в:
/ebooks
/ebooks/economic-genious
/ebooks/flight-mechanics
Код Javascript:
function getMappedURI(uri) {
var exp = new RegExp('/books/(.*)|/books$');
var destUri = '/ebooks/$1';
var redirectUri = uri.replace(exp, destUri);
return redirectUri;
}
Приведенный выше код отлично работает для следующих URI:
/books/economic-genious
/books/flight-mechanics
Но для URI /books
, он должен вернуться /ebooks/
. Но он добавляет некоторый непечатаемый специальный символ в конце/ebooks/
.
Я думаю, что пытается заменить $1
с каким-то особым персонажем.
Как избежать добавления спецсимвола в конце?
2 ответа
Попробуйте с этим регулярным выражением: \/books(\/(.*))?$
Демо здесь...
код:
function getMappedURI(uri) {
var exp = new RegExp('\/books(\/(.*))?$');
var destUri = '/ebooks$1';
var redirectUri = uri.replace(exp, destUri);
return redirectUri;
}
Операционная |
оператор работает только в скобках. Итак, вы должны сопоставить(/books/(.*)|/books$)
и я не думаю $
совпадение слов, потому что для чего-либо, что должно быть сопоставлено, оно также должно быть в скобках, что создает новый URL-адрес сопоставления: (/books/(.*)|/books)
. Затем вам придется использовать 2 доллара вместо 1 в качестве замены.
function getMappedURI(uri) {
var exp = new RegExp('(/books/(.*)|/books)');
var destUri = '/ebooks/$2';
var redirectUri = uri.replace(exp, destUri);
return redirectUri;
}
Но, если вы хотите, чтобы все от /books/foo
к /ebooks/foo
, используйте вместо этого: /books/(.*)
с 1 долларом в качестве замены.
function getMappedURI(uri) {
var exp = new RegExp('/books/(.*)');
var destUri = '/ebooks/$1';
var redirectUri = uri.replace(exp, destUri);
return redirectUri;
}