Я знаю, что это немного старый пост, но во всех регулярных выражениях здесь отсутствует один очень важный компонент: поддержка доменных имен IDN.
Доменные имена IDN начинаются с xn--. Они позволяют использовать расширенные символы UTF-8 в доменных именах. Например, знаете ли вы, что «♡ .com» - допустимое доменное имя? Да, "люблю сердце точка ком"! Чтобы проверить доменное имя, необходимо разрешить http://xn--c6h.com/ пройти проверку.
Обратите внимание: чтобы использовать это регулярное выражение, вам нужно будет преобразовать домен в нижний регистр, а также использовать библиотеку IDN, чтобы обеспечить кодирование доменных имен в ACE (также известное как «ASCII-совместимое кодирование»). Одна хорошая библиотека - GNU-Libidn.
idn (1) - это интерфейс командной строки для интернационализированной библиотеки доменных имен. В следующем примере имя хоста преобразуется в UTF-8 в кодировку ACE. Полученный URL https: //nic.xn--flw351e/ затем можно использовать как эквивалент https: // nic. 谷 歌 / в кодировке ACE .
$ 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 ведет список делегированных TLD, который можно использовать для просмотра некоторых примеров доменов 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,})$
Это регулярное выражение остановит домены, у которых в конце имени хоста стоит знак «-», как допустимые. Кроме того, он позволяет использовать неограниченное количество поддоменов.