Ответ 1
Subdomain
В соответствии с актуальными рекомендациями в Интернете (RFC3986 раздел 2.2, который, в свою очередь, ссылается на: RFC1034 раздел 3.5 и RFC1123 раздел 2.1), субдомен (который является частью имени хоста DNS-домена), должны соответствовать нескольким требованиям:
- Каждая часть поддомена должна иметь длину не более 63.
- Каждая часть субдомена должна начинаться и заканчиваться буквенно-цифровым (например, буквы
[A-Za-z]
или цифры[0-9]
). - Каждая часть субдомена может содержать дефисы (дефисы), но не может начинаться или заканчиваться дефисом.
Вот фрагмент выражения для части субдомена, которая отвечает этим требованиям:
[A-Za-z0-9](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?
Обратите внимание, что этот фрагмент выражения не должен использоваться отдельно - для этого требуется включение граничных условий в большем контексте, как показано в следующем выражении для имени хоста DNS...
Имя хоста DNS
Именованный узел (не IP-адрес) должен отвечать дополнительным требованиям:
- Имя хоста может состоять из нескольких частей субдомена, каждый из которых разделен одной точкой.
- Длина общего имени хоста не должна превышать 255 символов.
- Домен верхнего уровня (самая правая часть имени хоста DNS) должен быть одним из международно признанных значений. Список допустимых доменов верхнего уровня поддерживается IANA.ORG. (См. Текущий список голых костей здесь: http://data.iana.org/TLD/tlds-alpha-by-domain.txt).
С этим умом, здесь прокомментированное регулярное выражение (в синтаксисе PHP), которое будет псевдоопределять имя хоста DNS: (Обратите внимание, что это включает модифицированную версию вышеуказанного выражения для субдомена и добавляет к нему комментарии).
Обновление 2016-08-20:. Поскольку этот ответ был первоначально опубликован еще в 2011 году, количество доменов верхнего уровня взорвалось. По состоянию на август 2016 года в настоящее время более 1400. Оригинальное регулярное выражение для этого ответа включало в себя все эти, но это не логин. В новом регулярном выражении ниже используется другое выражение для домена верхнего уровня. Алгоритм исходит из: Спецификация имени доменного имени верхнего уровня-liman-tld-names-06.
$DNS_named_host = '%(?#!php/i DNS_named_host Rev:20160820_0800)
# Match DNS named host domain having one or more subdomains.
# See: http://stackoverflow.com/a/7933253/433790
^ # Anchor to start of string.
(?!.{256}) # Whole domain must be 255 or less.
(?: # One or more sub-domains.
[a-z0-9] # Subdomain begins with alpha-num.
(?: # Optionally more than one char.
[a-z0-9-]{0,61} # Middle part may have dashes.
[a-z0-9] # Starts and ends with alpha-num.
)? # Subdomain length from 1 to 63.
\. # Required dot separates subdomains.
)+ # End one or more sub-domains.
(?: # Top level domain (length from 1 to 63).
[a-z]{1,63} # Either traditional-tld-label = 1*63(ALPHA).
| xn--[a-z0-9]{1,59} # Or an idn-label = Restricted-A-Label.
) # End top level domain.
$ # Anchor to end of string.
%xi'; // End $DNS_named_host.
Обратите внимание, что это выражение не является совершенным. Он требует одного или нескольких поддоменов, но технически хост может состоять из TLD, не имеющего субдомена (но это редко).
Обновление 2014-08-12: Добавлено упрощенное выражение для поддомена, которое не требует чередования.
Обновление 2016-08-20: Измененное регулярное выражение имени хоста DNS (в общем) соответствует новому большому количеству допустимых доменов верхнего уровня. Кроме того, вырезали из ответа лишний материал.