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 для субдомена .