Javascript Регулярное выражение с несколькими условиями - PullRequest
2 голосов
/ 29 апреля 2020

Я использую модуль Nginx n js для некоторых модификаций 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 ]

2 голосов
/ 29 апреля 2020

Попробуйте использовать это регулярное выражение: \/books(\/(.*))?$

Демо здесь ...

код:

function getMappedURI(uri) {
    var exp = new RegExp('\/books(\/(.*))?$');
    var destUri = '/ebooks$1';
    var redirectUri = uri.replace(exp, destUri);
    return redirectUri;
}
1 голос
/ 29 апреля 2020

Оператор ИЛИ | работает только в паренах. Таким образом, вы должны сделать совпадение с (/books/(.*)|/books$), и я не думаю, что совпадение слова $, потому что, для чего-либо, что должно быть сопоставлено, должно быть и в скобках, делая новый URL URL: (/books/(.*)|/books). Затем вам придется использовать вместо $ 1 вместо $ 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...