2013-07-23 2 views
3

У меня есть одна таблица, которая выглядит следующим образом:Regex Match для доменного имени в Django модели

class Tld(models.Model): 
    domainNm = models.CharField(validators=[ RegexValidator('^[0-9]^[a-z]','yourdomain.com only','Invalid Entry')], max_length=40) 
    dtCreated = models.DateField() 

для domainNm - Я хочу, чтобы проверить на любой записи, которая выглядит как:

  • domain.com
  • 1domain.com
  • domain1.com

Он должен следовать следующим образом: <domainname>.[com|biz|net] и т. Д. И быть буквенно-цифровым.

Как это сделать на уровне модели модели django?

Благодаря

+1

Это недопустимое регулярное выражение. **^** соответствует началу строки. Нет смысла иметь его там дважды, если не разделять ** | **. В любом случае, неясно, что вы хотите совместить. Вы пытаетесь удостовериться, что строка начинается с буквенно-цифрового символа или что все это буквенно-цифровое с точками и, возможно, «http: //» в начале или что? Пожалуйста, постарайтесь быть конкретными и дайте примеры того, что вы хотите, чтобы регулярное выражение совпало и что вы хотите его отклонить. –

+0

См. Обновленный вопрос. Извините за недоразумение – CodeTalk

+0

Итак, вы сейчас говорите, что вы * не * хотите совпадать, если он начинается с «www» или «http: //», вы все еще хотите совместить, если какой-либо из них предшествует домену? Кроме того, вы хотите ограничить его одной точкой, или вы также хотите совместить, если есть субдомены? Регулярное выражение '^ [a-z0-9] + \. (Com | biz | net) $' будет проверять, что строка находится в форме, которую вы описали в пересмотренном вопросе, но я не уверен, что это вы действительно хотеть. Должны ли 'http: // domain.com' и/или' subdomain.domain.com' соответствовать или терпеть неудачу? –

ответ

3

Резюмируя разъяснения выше: Вы хотите сопоставлять только домены с одной буквенно-цифровой меткой и TLD до 4 символа, например. «domain.com» или «someotherdomain.info» или «345xyz.pdq1», но не «subdomain.domain.com», «http://domain.com», «www.domain.com» или «345xyz.abcde». Это регулярное выражение будет делать это:

^[a-z0-9]+\.[a-z0-9]{1,4}$ 
+0

Спасибо, что помогли мне приблизиться к ответу! – CodeTalk

+0

Это очень ограниченный. т.е.: express.co.uk будет ломаться, и поэтому www. * domains (хотя вы упомянули, я бы скорее настаивал на этом). – vinyll

10

Если вы хотите проверить HTTP URL, забывают регулярное выражение и использовать builtin validator.

Если вы хотите только домены без какого-либо протокола, попробуйте:

def full_domain_validator(hostname): 
    """ 
    Fully validates a domain name as compilant with the standard rules: 
     - Composed of series of labels concatenated with dots, as are all domain names. 
     - Each label must be between 1 and 63 characters long. 
     - The entire hostname (including the delimiting dots) has a maximum of 255 characters. 
     - Only characters 'a' through 'z' (in a case-insensitive manner), the digits '0' through '9'. 
     - Labels can't start or end with a hyphen. 
    """ 
    HOSTNAME_LABEL_PATTERN = re.compile("(?!-)[A-Z\d-]+(?<!-)$", re.IGNORECASE) 
    if not hostname: 
     return 
    if len(hostname) > 255: 
     raise ValidationError(_("The domain name cannot be composed of more than 255 characters.")) 
    if hostname[-1:] == ".": 
     hostname = hostname[:-1] # strip exactly one dot from the right, if present 
    for label in hostname.split("."): 
     if len(label) > 63: 
      raise ValidationError(
       _("The label '%(label)s' is too long (maximum is 63 characters).") % {'label': label}) 
     if not HOSTNAME_LABEL_PATTERN.match(label): 
      raise ValidationError(_("Unallowed characters in label '%(label)s'.") % {'label': label}) 

Использование:

from django.core.validators import URLValidator 

field = models.CharField(_('host name'), max_length=255, validators=[URLValidator]) 

или

field = models.CharField(_('host name'), max_length=255, validators=[full_domain_validator]) 
+1

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

+1

Этот валидатор позволит указать имя хоста: домен (без tld) – jakobdo

Смежные вопросы