Проверить формат субдомена - PullRequest
0 голосов
/ 17 февраля 2020

Как правильно проверить формат субдомена?

Вот что у меня есть:

  validates :subdomain, uniqueness: true, case_sensitive: false
  validates :subdomain, format: { with: /\A[A-Za-z0-9-]+\z/, message: "not a valid subdomain" }
  validates :subdomain, exclusion: { in: %w(support blog billing help api www host admin en ru pl ua us), message: "%{value} is reserved." }
  validates :subdomain, length: { maximum: 20 }
  before_validation :downcase_subdomain
  protected
    def downcase_subdomain
      self.subdomain.downcase! if attribute_present?("subdomain")
    end  

Вопрос:

Существует ли стандартная проверка субдомена REGEX, например есть для электронной почты? Какой самый лучший REGEX для использования субдомена?

validates :email, format: { with: URI::MailTo::EMAIL_REGEXP }, allow_blank: true

1 Ответ

5 голосов
/ 18 февраля 2020

RF C 1035 определяет синтаксис субдомена следующим образом:

<subdomain> ::= <label> | <subdomain> "." <label>

<label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]

<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>

<let-dig-hyp> ::= <let-dig> | "-"

<let-dig> ::= <letter> | <digit>

<letter> ::= any one of the 52 alphabetic characters A through Z in
upper case and a through z in lower case

<digit> ::= any one of the ten digits 0 through 9

И милосердное удобочитаемое описание.

[Ярлыки] должны начинаться буквой, оканчивается буквой или ди git и иметь в качестве внутренних символов только буквы, цифры и дефис. Есть также некоторые ограничения по длине. Метки должны содержать не более 63 символов.

Большую часть этого можно выполнить с помощью регулярного выражения и ограничения длины по отдельности.

validates :subdomain, format: {
  with: %r{\A[a-z](?:[a-z0-9-]*[a-z0-9])?\z}i, message: "not a valid subdomain"
}, length: { in: 1..63 }

Извлечение этого регулярного выражения в клочки, чтобы объяснить это .

%r{
  \A
  [a-z]                       # must start with a letter
  (?:
    [a-z0-9-]*                # might contain alpha-numerics or a dash
    [a-z0-9]                  # must end with a letter or digit
  )?                          # that's all optional
 \z
}ix

У нас может возникнуть желание использовать более простой /\A[a-z][a-z0-9-]*[a-z0-9]?\z/i, но это позволяет foo-.

См. Также Regexp для субдомена .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...