Регулярное выражение 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;
}
Другие вопросы по тегам