Я для проверки использую нодовский модуль url. Он парсит адрес (обязательно с протоколом) и раскладывает его по компонентам - протокол, имя, порт, путь, параметры и т.д., причем имя сразу в паникод преобразовывает - не надо с национальными символами в регэкспе ничего выдумывать.
function validateUrl(address) {
let url = require('url');
let addressRegexp = new RegExp('^([\\w\\-]+?\\.?)+?\\.[\\w\\-]+?$');
if (address.search(/^(ftp|http|https):\/\//) === -1) { address = 'http://' + address; }
let hname = url.parse(address).hostname;
if (hname.length < 4 || hname.length > 255 || !addressRegexp.test(hname)) {
throw new WrongInput('');
}
}
https://nodejs.org/dist/latest-v6.x/docs/api/url.html