Как проверить, что строка — правильный URL
Короткий ответ
URL.canParse() возвращает true, если строка — полный адрес:
console.log(URL.canParse('https://example.com/page'));
console.log(URL.canParse('example.com'));
console.log(URL.canParse('not a url'));Результат:
true
false
falseТолько http и https
Строки вроде javascript:alert(1) — тоже правильные адреса. Для ссылок от пользователей проверяйте и протокол:
const isWebUrl = (value) => {
try {
const url = new URL(value);
return url.protocol === 'http:' || url.protocol === 'https:';
} catch {
return false;
}
};
console.log(isWebUrl('https://example.com'));
console.log(isWebUrl('javascript:alert(1)'));
console.log(isWebUrl('ftp://files.example.com'));Результат:
true
false
falseЧастая ошибка
Регулярное выражение для URL легко написать неправильно: оно либо отсекает настоящие адреса, либо пропускает плохие. Объект URL разбирает адреса точно так же, как браузер.
const naive = /^https?:\/\/\w+\.\w+$/;
console.log(naive.test('https://example.com/blog'));
console.log(URL.canParse('https://example.com/blog'));Результат:
false
trueФункции из этого ответа
- URL — Разбирает адрес на части и собирает его обратно.