Проверить правильное доменное имя в строке? - PullRequest
10 голосов
/ 24 мая 2010

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

Ответы [ 5 ]

15 голосов
/ 24 мая 2010

Любое доменное имя (синтаксически) является допустимым, если оно представляет собой список идентификаторов, разделенных точками, каждый длиной не более 63 символов и состоящий из букв, цифр и тире (без подчеркивания).

Итак:

r'[a-zA-Z\d-]{,63}(\.[a-zA-Z\d-]{,63})*'

будет началом. Конечно, в наши дни могут быть разрешены некоторые не-Ascii символы (очень недавняя разработка), которая сильно меняет параметры - вам нужно с этим справиться?

6 голосов
/ 24 мая 2010
r'^(?=.{4,255}$)([a-zA-Z0-9][a-zA-Z0-9-]{,61}[a-zA-Z0-9]\.)+[a-zA-Z0-9]{2,5}$'
  • Lookahead гарантирует, что оно имеет минимум 4 (a.in) и максимум 255 символов
  • Одна или несколько меток (разделенных точками) длиной от 1 до 63, начинающихся и заканчивающихся буквенно-цифровыми символами и содержащих в середине буквенно-цифровые символы и дефисы.
  • За ним следует доменное имя верхнего уровня (максимальная длина которого составляет 5 для музея)
2 голосов
/ 24 мая 2010

Обратите внимание, что хотя вы можете делать что-то с регулярными выражениями, самый надежный способ для проверки правильности доменных имен - это попытка действительно разрешить имя (с сокетом ). .getaddrinfo ):

from socket import getaddrinfo

result = getaddrinfo("www.google.com", None)
print result[0][4]

Обратите внимание, что технически это может оставить вас открытыми для DoS (если кто-то отправляет тысячи недопустимых доменных имен, это может занять некоторое время для разрешения недопустимых имен), но вы можете просто ограничить количество пользователей, которые пытаются это сделать.

Преимущество этого в том, что он будет распознавать «hotmail.con» как недопустимый (скажем, вместо «hotmail.com»), тогда как регулярное выражение скажет, что «hotmail.con» допустим.

0 голосов
/ 12 декабря 2017

Ответы все довольно устарели со спецификацией на данный момент. Я полагаю, что ниже будет соответствовать текущей спецификации правильно:

r'^(?=.{1,253}$)(?!.*\.\..*)(?!\..*)([a-zA-Z0-9-]{,63}\.){,127}[a-zA-Z0-9-]{1,63}$'
0 голосов
/ 11 ноября 2013

Я использую это:

(r'(\.|\/)(([A-Za-z\d]+|[A-Za-z\d][-])+[A-Za-z\d]+){1,63}\.([A-Za-z]{2,3}\.[A-Za-z]{2}|[A-Za-z]{2,6})')

, чтобы гарантировать, что оно следует либо после точки (www.), Либо / (http://)), и дефис появляется только внутри имени и соответствует суффиксам, таким как gov.uk.

...