Проверить на допустимое доменное имя в строке?

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

10
задан demos 24 May 2010 в 05:23
поделиться

3 ответа

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

Итак:

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

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

15
ответ дан 3 December 2019 в 17:19
поделиться

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

from socket import getaddrinfo

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

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

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

2
ответ дан 3 December 2019 в 17:19
поделиться
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 для музея)
6
ответ дан 3 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: