Страницы

Поиск по вопросам

пятница, 19 апреля 2019 г.

Как заменить абсолютный адрес на относительный регулярным выражением?

Написал вот такой тест
// the domain is 'test.dev' function test (str) { rep = str.replace(/^(?:https?:)?\/\/test\.dev(?:$|\/)/, "/"); console.log('Was: ' + str + '
Now: ' + rep); } test("http://test.dev/path?query=string"); test("https://test.dev/"); test("//test.dev"); test("//test.dev/?query=string");
, который работает и выдает
Was: http://test.dev/path?query=string Now: /path?query=string
Was: https://test.dev/ Now: /
Was: //test.dev Now: /
Was: //test.dev/?query=string Now: /?query=string
Но ссылка может быть еще и такого вида (без слэша перед началом query string): //test.dev?query=string, и тогда регулярка выше не срабатывает. Как бы в нее попроще этот вопросительный знак воткнуть?
Из //test.dev?query=string должно получиться /?query=string
Придется дополнить вопрос. Исходные ссылки могут быть не только на test.dev, но и на другие сайты (например, test.devil). Такие ссылки нельзя превратить в относительные, точнее можно, но это не будет иметь смысла по отношению к сайту test.dev, поэтому они должны оставаться как есть.


Ответ

Предлагаю заменить rep = str.replace(/^(?:https?:)?\/\/test\.dev(?:$|\/)/, "/"); на
rep = str.replace(/^(?:https?:)?\/\/test\.dev(?:$|\/|(\?))/, "/$1"); ^^^^
Добавив захватывающую подмаску (\?) в качестве ещё одной альтернативы в незахватывающую группу, можно отловить знак вопроса, а потом с помощью обратной ссылки $1 в шаблоне замены восстановить его в получаемой строке.
function test (str) { rep = str.replace(/^(?:https?:)?\/\/test\.dev(?:$|\/|(\?))/, "/$1"); console.log('Was: ' + str + '
Now: ' + rep); } test("http://test.dev/path?query=string"); test("https://test.dev/"); test("//test.dev"); test("//test.dev/?query=string"); test("//test.dev?query=string"); // /?query=string

Комментариев нет:

Отправить комментарий