Я использую Python и хотел бы, чтобы простой API или regex проверили на законность доменного имени. Законностью я - синтаксическая законность и не, существует ли доменное имя на самом деле в Интернете или нет.
Любое доменное имя является (синтаксически) допустимым, если оно представляет собой список идентификаторов, разделенных точками, каждый не длиннее 63 символов и состоящий из букв, цифр и дефисов (без подчеркивания).
Итак:
r'[a-zA-Z\d-]{,63}(\.[a-zA-Z\d-]{,63})*'
было бы началом. Конечно, в наши дни могут быть разрешены некоторые символы, отличные от Ascii (очень недавняя разработка), что сильно меняет параметры - вам нужно с этим иметь дело?
Обратите внимание, что хотя вы можете сделать что-то с регулярными выражениями, самый надежный способ проверки правильности доменных имен - это попытаться разрешить имя (с сокетом .getaddrinfo ):
from socket import getaddrinfo
result = getaddrinfo("www.google.com", None)
print result[0][4]
Обратите внимание, что технически это может оставить вас уязвимым для DoS (если кто-то отправит тысячи недопустимых доменных имен, может потребоваться некоторое время, чтобы разрешить недопустимые имена), но вы можете просто ограничить скорость того, кто попытается это.
Преимущество этого заключается в том, что он распознает «hotmail.con» как недопустимый (вместо, скажем, «hotmail.com»), в то время как регулярное выражение говорит, что «hotmail.con» действителен.
r'^(?=.{4,255}$)([a-zA-Z0-9][a-zA-Z0-9-]{,61}[a-zA-Z0-9]\.)+[a-zA-Z0-9]{2,5}$'
a.in
) и максимум 255 символов