Я знаю, що це трохи старе повідомлення, але в усіх регулярних виразах тут відсутній один дуже важливий компонент: підтримка доменних імен IDN.
Іменні доменні імена починаються з xn--. Вони включають розширені UTF-8 символів у доменних іменах. Наприклад, чи знаєте ви, що "♡ .com" - дійсне доменне ім'я? Так, "love heart dot com"! Для перевірки доменного імені потрібно дозволити http://xn--c6h.com/ пройти перевірку.
Зауважте, щоб використовувати цей регулярний вираз, вам потрібно буде перетворити домен у малі регістри, а також використовувати бібліотеку IDN, щоб переконатися, що ви кодуєте доменні імена в ACE (також відомий як "ASCII сумісне кодування"). Одна гарна бібліотека - GNU-Libidn.
idn (1) - інтерфейс командного рядка до інтернаціоналізованої бібліотеки доменних імен. Наступний приклад перетворює ім'я хоста в UTF-8 в кодування ACE. Отримана URL-адреса https: //nic.xn--flw351e/ може бути використана як кодований ACE еквівалент https: // nic. 谷 歌 / .
$ idn --quiet -a nic.谷歌
nic.xn--flw351e
Цей магічний регулярний вираз повинен охоплювати більшість доменів (хоча, я впевнений, є багато дійсних крайових випадків, які я пропустив):
^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$
Вибираючи регекс для перевірки домену, слід побачити, чи домен відповідає наступному:
- xn--stackoverflow.com
- stackoverflow.xn - ком
- stackoverflow.co.uk
Якщо ці три домени не проходять, ваш регулярний вираз може не дозволяти законних доменів!
Перегляньте сторінку підтримки інтернаціоналізованих доменних імен у Міжнародному посібнику з мовного середовища Oracle для отримання додаткової інформації.
Спробуйте випробувати регекс тут: http://www.regexr.com/3abjr
ICANN зберігає список делегованих tlds, які можна використовувати для перегляду деяких прикладів доменів IDN.
Редагувати:
^(((?!-))(xn--|_{1,1})?[a-z0-9-]{0,61}[a-z0-9]{1,1}\.)*(xn--)?([a-z0-9][a-z0-9\-]{0,60}|[a-z0-9-]{1,30}\.[a-z]{2,})$
Цей регулярний вираз зупинить домени, які мають "-" в кінці імені хоста, як позначені як дійсні. Крім того, це дозволяє необмежену кількість субдоменів.