Оригінальна відповідь
Дуже швидко і дуже гнучко перевірка:
if (url.indexOf('://') > 0 || url.indexOf('//') === 0 ) {
} else {
}
Це розпізнає абсолютну URL-адресу, якщо:
- URL-адреса містить ": //" де завгодно після першого символу, або
- URL починається з "//" (відносно протоколу)
- Немає регулярного виразу.
- Немає jQuery чи іншої залежності.
- Жодних закодованих імен протоколів, які роблять умову чутливою до регістру.
- Відсутність маніпуляцій із рядками (наприклад, toLowerCase або подібне).
- Тільки перевірка на "відносну або абсолютну", але не робить ніяких інших перевірок осудності, може бути використана для веб-URL або будь-якого внутрішнього протоколу.
Оновлення 1 (повний приклад функції)
Ось швидка функція, яка повертає true / false для вказаної URL-адреси:
function isUrlAbsolute(url) {
return (url.indexOf('://') > 0 || url.indexOf('//') === 0);
}
І те саме в ES6:
const isUrlAbsolute = (url) => (url.indexOf('://') > 0 || url.indexOf('//') === 0)
Оновлення 2 (URL-адреси всередині параметра URL)
Для додаткової адреси URL-адрес у форматі /redirect?target=http://example.org
я рекомендую використовувати цей код:
function isUrlAbsolute(url) {
if (url.indexOf('//') === 0) {return true;}
if (url.indexOf('://') === -1) {return false;}
if (url.indexOf('.') === -1) {return false;}
if (url.indexOf('/') === -1) {return false;}
if (url.indexOf(':') > url.indexOf('/')) {return false;}
if (url.indexOf('://') < url.indexOf('.')) {return true;}
return false;
}
І те саме у короткій формі та ES 6
function isUrlAbsolute(url) {
return url.indexOf('//') === 0 ? true : url.indexOf('://') === -1 ? false : url.indexOf('.') === -1 ? false : url.indexOf('/') === -1 ? false : url.indexOf(':') > url.indexOf('/') ? false : url.indexOf('://') < url.indexOf('.') ? true : false;
}
const isUrlAbsolute = (url) => (url.indexOf('//') === 0 ? true : url.indexOf('://') === -1 ? false : url.indexOf('.') === -1 ? false : url.indexOf('/') === -1 ? false : url.indexOf(':') > url.indexOf('/') ? false : url.indexOf('://') < url.indexOf('.') ? true : false)
Ось кілька тестових випадків:
console.log( isUrlAbsolute('http://stackoverflow.com') )
console.log( isUrlAbsolute('//stackoverflow.com') )
console.log( isUrlAbsolute('stackoverflow.com') )
console.log( isUrlAbsolute('Ftp://example.net') )
console.log( isUrlAbsolute('/redirect?target=http://example.org') )
Оновлення 3 (уточнити відносні URL-адреси)
Я бачив кілька коментарів щодо недійсного виводу:
- Рішення повертає значення false для
localhost
- Відповідь не вдається
http:example.com
Однак ці URL-адреси насправді є відносними URL-адресами . Це легко перевірити:
- Скажімо, створіть кілька папок на вашому localhost webroot
a/b/c/
- Створіть файл index.html і розмістіть у ньому таке посилання:
<a href="localhost">test</a>
- Відкрийте сторінку індексу у вашому браузері: http: //localhost/a/b/c/index.html і натисніть на посилання. Ви закінчите на http: // localhost / a / b / c / localhost (а не на http: // localhost )
- Те саме відбувається при розміщенні посилання
http:example.com
у вашому файлі index.html. Ви закінчуєте на http: //localhost/a/b/c/example.com замість http://example.com
//
.