URL валидация regex

126
11 февраля 2021, 10:50

Какой regex должен быть что бы покрыть все эти кейсы, искал на разных порталах, но подходящего так и не нашел. Нужно пропускать только валидные урлы

http://localhost:8080
https://some-host-name
https://127.0.0.1:4545
http://load-balancer/some-path
http://load-balancer:8332
http://load-balancer:8332/some-path
http://localhost:8080/storage/v1/diag/ping
https://some-host-name/storage/v1/diag/ping
https://127.0.0.1:4545/storage/v1/diag/ping
http://load-balancer/some-path/storage/v1/diag/ping
http://load-balancer:8332/storage/v1/diag/ping
http://load-balancer:8332/some-path/storage/v1/diag/ping
Answer 1

Можно воспользоваться конструктором URL, но он пропустит не только http/https ссылки.
Впрочем, можно дополнить функцию проверкой схемы объекта URL.

let urls = [ 
 'http://localhost:8080', 
 'https://some-host-name', 
 'https://127.0.0.1:4545', 
 'http://load-balancer/some-path', 
 'http://load-balancer:8332', 
 'http://load-balancer:8332/some-path', 
 'http://localhost:8080/storage/v1/diag/ping', 
 'https://some-host-name/storage/v1/diag/ping', 
 'https://127.0.0.1:4545/storage/v1/diag/ping', 
 'http://load-balancer/some-path/storage/v1/diag/ping', 
 'http://load-balancer:8332/storage/v1/diag/ping', 
 'http://load-balancer:8332/some-path/storage/v1/diag/ping', 
 'ftp://example.org/123', 
 'my@email', // TypeError will be thrown 
]; 
 
function isUrlValid(url) { 
  try {new URL(url); return true;} 
  catch(e) {return false;} 
} 
 
urls.forEach(url => { 
 
  console.log(url, isUrlValid(url)); 
});

Мне это для валидации инпута

Используйте input[type=url]

const url = document.querySelector('input'); 
document.querySelector('button') 
  .addEventListener('click', e => { 
  console.log(url.checkValidity()) 
})
<input type="url" pattern="https?://.*" required="required" value="http://???" /> 
<button>Check</button>

Answer 2

Вот эта регулярка вам подойдет - ^http[s]?:\/\/[a-zA-Z\d.-]+[:]?[\d]{0,4}[\/]?[a-zA-Z\d\/-]+.

Но как сказал @andreymal - при такой формулировке вопроса вам и (.*) хватит.

Единственное, что по факту определяет предоставленная мной регулярка - это схему.

READ ALSO
Как парсить auto ru?

Как парсить auto ru?

Есть учебное заданиеНужно достать достать из раздела с мотоциклами всю информацию по объявлениям что есть

125
Кнопка в html работает а в php уже нет

Кнопка в html работает а в php уже нет

не работает код кнопки передающий данные таблици в pdf в файле который с расширением html работает, а вот уже в php нет в чем может быть проблема?

99
Не работает геокодер в приложении

Не работает геокодер в приложении

Всем привет! Я использую Яндекс геокодер в приложении cordovaКарты работают нормально, однако геокодер выдает ошибку: Failed to load resource: the server responded...

109
Стейты реакт в методах

Стейты реакт в методах

Я могу создать стейт и менять его в классе так:

129