2014-01-06 4 views
9

Я пытаюсь написать код, который будет принимать в «предполагается» доменное имя и проверить его в соответствии с RFC 1035. Например, нужно будет удовлетворять следующим правилам:Как я могу проверить, соответствует ли доменное имя RFC 1035 с использованием Python?

  • Домен не состоит из не более 253 всего символов
  • домен набор символов [a-z0-9\-] только (понизит случае область на входе)
  • домена не может содержать два последовательных дефиса (например: google--com.com)
  • Существует максимальный предел подобласть 127

Я искал различные модули Python (например, tldextract), но безрезультатно.

Как я могу подтвердить, что доменное имя соответствует RFC 1035?

+5

Вы исключающие тир полностью в правиле 2, то скажем, что не может быть двух подряд, где на самом деле нет такого ограничения; скорее, [IDNA] (http://en.wikipedia.org/wiki/Internationalized_domain_name) на самом деле зависит от последовательных тире как части кодировки. – tripleee

+0

Это [обсуждается по мета] (http://meta.stackexchange.com/questions/215135/please-edit-library-recommendation-questions-with-well-specced-problems-instea) - пожалуйста, проследите там, если у вас есть что сказать, что не имеет прямого отношения к этому вопросу, как сейчас. – Shog9

+0

@tripleee Спасибо, ты прав. Отредактировано мое сообщение, чтобы отразить тире. Кроме того, спасибо за ссылку на сообщение IDNA, я также исследую это. – gleb1783

ответ

5

ПОЦЕЛУЙ:

import string 

VALID_CHARS = string.lowercase + string.digits + '-.' 

def is_valid_domain(domain): 
    if not all(char in VALID_CHARS for char in domain.lower()): 
     return False 
    if len(domain) > 253: 
     return False 
    if '--' in domain: 
     return False 
    if '..' in domain: 
     return False 
    return True 

Есть время для сообразительности, но это, кажется, не один из них.

+0

Ваш код соответствует правилам опроса, но это не то же самое, что и правила RFC. Например, он не примет ни одного доменного имени с ''. "' В нем, что является довольно критической ошибкой. – Blckknght

+0

Упс! Пропустил это. –

+1

Далее, опубликуйте это как модуль, дождитесь его выхода из Интернета в некоторых частях мира, о которых вы не помните. – tripleee

3

Я думаю, что это довольно просто решить для себя, если вы только касаетесь доменов RFC 1035. Более поздние спецификации позволяют больше видов доменных имен, поэтому этого будет недостаточно для реального мира!

Вот решение, которое использует регулярное выражение для соответствия именам доменов, которые следуют «предпочтительному синтаксису имени», описанному на страницах 6 и 7 RFC. Он обрабатывает все, кроме предела верхнего уровня по количеству символов с помощью одного шаблона:

import re 

def validate_domain_name(name): 
    if len(name) > 255: return False 
    pattern = r"""(?X)  # use verbose mode for this pattern 
       ^   # match start of the input 
        (?:   # non-capturing group for the whole name 
        [a-zA-Z] # first character of first label 
        (?:  # non-capturing group for the rest of the first label 
         [a-zA-Z0-9\-]{,61} # match middle characters of label 
         [a-zA-Z0-9]   # match last character of a label 
        )?  # characters after the first are optional 
        (?:  # non-capturing group for later labels 
         \.  # match a dot 
         [a-zA-Z](?:[a-zA-Z0-9\-]{,61}[a-zA-Z0-9])? # match a label as above 
        )*  # there can be zero or more labels after the first 
       )?   # the whole name is optional ("" is valid) 
        $   # match the end of the input""" 
    return re.match(pattern, name) is not None # test and return a Boolean 
0

Validating domain

образца после размещения всех изменений