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

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

4 Solutions collect form web for “Проверить допустимое доменное имя в строке?”

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

Так:

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

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

 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 для музея)

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

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

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

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

Я использовал это:

 (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.

Python - лучший язык программирования в мире.