Имя хоста Regex - PullRequest
       2

Имя хоста Regex

28 голосов
/ 13 сентября 2009

Я ищу регулярное выражение для проверки имен хостов. Он должен полностью соответствовать стандарту. Прямо сейчас у меня есть

^[0-9a-z]([0-9a-z\-]{0,61}[0-9a-z])?(\.[0-9a-z](0-9a-z\-]{0,61}[0-9a-z])?)*$

, но допускает последовательные переносы и имена хостов длиннее 255 символов. Если идеальное регулярное выражение невозможно, так и скажите.

Редактирование / уточнение: поиск Google не выявил, что это решенная (или доказанная неразрешимая) проблема. Я хочу создать окончательное регулярное выражение, чтобы никто никогда не писал свой собственный. Если диалекты имеют значение, я хочу версию для каждого, в которой это может быть сделано.

Ответы [ 5 ]

27 голосов
/ 14 сентября 2009

^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\.?$

7 голосов
/ 28 августа 2013

Утвержденный ответ подтверждает недействительные имена хостов, содержащие несколько точек (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])?)*$
4 голосов
/ 14 сентября 2009

Ваш ответ был относительно близок.

Но см.

Для имени хоста RE этот модуль perl производит

(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]|[a-zA-Z])[.]?)

Я бы изменил, чтобы быть более точным, как:

(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]{0,61})?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-zA-Z0-9]{0,61}[a-zA-Z0-9]|[a-zA-Z])[.]?)

При желании привязка концов с помощью ^$ ТОЛЬКО для совпадения имен хостов.

Я не думаю, что один RE может выполнить полную проверку, потому что, согласно Wikipedia , существует ограничение в 255 символов, которое, я не думаю, может быть включено в этот же RE, в по крайней мере, не без тонны изменений, но достаточно просто проверить длину <= 255 перед запуском RE. </p>

1 голос
/ 13 сентября 2009

Посмотрите на следующий вопрос. Некоторые ответы имеют регулярные выражения для имен хостов

Не могли бы вы указать, на каком языке вы хотите использовать это регулярное выражение? Большинство языков / систем имеют немного отличающиеся реализации регулярных выражений, которые будут влиять на ответы людей.

0 голосов
/ 04 июня 2012

А как же:

^(?=.{1,255})([0-9A-Za-z]|_{1}|\*{1}$)(?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?)*\.?$

для сопоставления только одного '_' (для некоторых SRV) в начале и только одного * (в случае метки для подстановочного знака DN)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...