Написал вот такой тест
// 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
Комментариев нет:
Отправить комментарий