Ruby-验证子域格式

问题描述 投票:0回答:2

如何正确验证子域格式?

这是我所拥有的:

  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

ruby-on-rails regex ruby subdomain
2个回答
0
投票

RFC 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

以及仁慈的人类可读描述。

[标签]必须以字母开头,以字母或数字结尾,并且只能包含字母,数字和连字符作为内部字符。也有一些长度的限制。标签不得超过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 for subdomain


-1
投票

是否有标准的REGEX子域验证,例如电子邮件?子域名使用的最佳REGEX是什么?

在同一表达式中使用最佳和正则表达式是矛盾的。使用正则表达式来解析URI之类的复杂事物充其量是有缺陷的。就像没有一个正则表达式可以根据RFC 5322实际处理电子邮件的实际验证一样。它们全都是能处理99%且生活在边缘情况下无知幸福的黑客。

相反,您需要一个实际的URI解析器。 URI模块根据RFC2396处理URI:

validate :subdomain_format
def  subdomain_format
  begin
    URI.parse("http://#{subdomain}.example.com")
  rescue URI::InvalidURIError
    errors.add(:subdomain, 'format is invalid')
  end
end

但是wf23fg24tml35k--实际上是完全有效的子域名。就像"john..doe"@example.orguser%[email protected]是有效的电子邮件地址一样,这些电子邮件地址会在粘贴在整个Internet上的正则表达式副本中爆炸。

© www.soinside.com 2019 - 2024. All rights reserved.