rails 电子邮件验证格式和正则表达式

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

目前正在学习 Michael Hartl rails 教程

在 rails 中给出以下测试

  test "email validation should accept valid addresses" do
    valid_addresses = %w[[email protected] [email protected] [email protected]
                         [email protected] [email protected]]
    valid_addresses.each do |valid_address|
      @user.email = valid_address
      assert @user.valid?, "#{valid_address.inspect} should be valid"
    end
  end

  test "email validation should reject invalid addresses" do
    invalid_addresses = %w[user@example,com user_at_foo.org user.name@example.
                           foo@bar_baz.com foo@bar+baz.com]
    invalid_addresses.each do |invalid_address|
      @user.email = invalid_address
      assert_not @user.valid?, "#{invalid_address.inspect} should be invalid"
    end
  end

和以下用于电子邮件格式验证的正则表达式

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }

有人可以向我解释关于正则表达式的测试是什么吗?为什么有效测试只有 [email protected][email protected] 等。如果我向 valid_addresses 添加另一个元素,即 [email protected] 会怎么样。为什么 Michael 特意选择上面的 5 个示例电子邮件作为 valid_addresses 和 5 个 invalid_addresses?

如果正则表达式测试所有格式并且只返回特定格式,我们为什么还需要测试?

ruby-on-rails regex testing ruby-on-rails-4 railstutorial.org
3个回答
2
投票

让我们分解表达式(记住

i
修饰符使其不区分大小写):

\A          (?# anchor to the beginning of the string)
[\w+\-.]+   (?# match 1+ a-z, A-Z, 0-9, +, _, -, or .)
@           (?# match literal @)
[a-z\d\-.]+ (?# match 1+ a-z, 0-9, -, or .)
\.          (?# match literal .)
[a-z]+      (?# match 1+ a-z)
\z          (?# anchor to the absolute end of the string)

这就是教程定义的电子邮件(实际上,它复杂得多)。因此,作者 Michael Hartl 为“有效”和“无效”(根据上述定义)电子邮件编写了几个测试。

几乎“用户”可以是字母数字或包含

_+-.
。 “域”可以是字母数字或
-.
。而“TLD”只能是字母。前 5 封电子邮件使用这些先前规则的许多变体作为“可接受的”电子邮件。由于以下原因,最后 5 封电子邮件失败:

  • user@example,com
    -
    ,
    无法匹配
  • user_at_foo.org
    - 没有
    @
  • user.name@example.
    -
    .
  • 之后没有 TLD
  • foo@bar_baz.com
    - 域不能包含
    _
  • foo@bar+baz.com
    - 域不能包含
    +

显然,如果您想要匹配(或不匹配)更具体的电子邮件,请将它们添加到测试数组中。如果你的测试失败了,你知道你需要更新你的表达 :)


0
投票

我认为尝试习惯正则表达式的最好方法是尝试不同的正则表达式。如果你尝试使用 Rubular.com(就像书中推荐的那样)并粘贴:

\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z
在正则表达式部分。字母
i
出现在正则表达式后面的文本框中。然后,如果您在测试字符串部分粘贴电子邮件地址:user@example,com,您会注意到电子邮件地址不匹配,但如果您将逗号替换为点,那么它将匹配。第二个不正确的电子邮件地址只是测试字符 @ 是否包含在内(在本例中缺少)。

第三个不正确的电子邮件地址测试后缀包含 1 个或多个字母。 4th incorrect email address 测试电子邮件地址中@后没有下划线。 第 5 个不正确的电子邮件地址测试电子邮件地址中 @ 后没有 + 字符。

正确的电子邮件地址基本上测试相同的东西,但在那些电子邮件地址中,下划线和加号位于电子邮件地址的正确部分。它还测试 [email protected] 电子邮件地址是否保存在用户模型小写中:

before_save { self.email = email.downcase }
如果没有发生,它在测试中将不是有效的电子邮件地址。


0
投票

2023 年入住的所有人。

您可以使用:

validates :email, format: { with: URI::MailTo::EMAIL_REGEXP }
© www.soinside.com 2019 - 2024. All rights reserved.