Утвержденный ответ подтверждает недействительные имена хостов, содержащие несколько точек (example..com
). Вот регулярное выражение, которое я придумала и которое, я думаю, в точности соответствует тому, что допустимо в соответствии с требованиями RFC (минус окончание ".", Поддерживаемое некоторыми распознавателями для короткого замыкания относительного именования и принудительного разрешения FQDN).
Spec:
<hname> ::= <name>*["."<name>]
<name> ::= <letter-or-digit>[*[<letter-or-digit-or-hyphen>]<letter-or-digit>]
Regex:
^([a-zA-Z0-9](?:(?:[a-zA-Z0-9-]*|(?<!-)\.(?![-.]))*[a-zA-Z0-9]+)?)$
Я сам проверил довольно много перестановок, думаю, это точно.
Это регулярное выражение также не выполняет проверку длины. RFC требует ограничения длины меток между точками и именами, но длины можно легко проверить как второй и третий проходы после проверки по этому регулярному выражению, путем проверки полной длины строки и разделения на "." и проверка длины всех подстрок. Например, в JavaScript проверка длины метки может выглядеть следующим образом: "example.com".split(".").reduce(function (prev, curr) { return prev && curr.length <= 63; }, true)
.
Альтернативное регулярное выражение (без негативного взгляда, любезно предоставлено HTML Living Standard):
^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$