【问题标题】:Rails regex email validation with no spaces allowedRails 正则表达式电子邮件验证,不允许使用空格
【发布时间】:2021-02-26 07:11:18
【问题描述】:

我目前正在使用此代码进行电子邮件验证:

/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

问题是它仍然接受带有ab c@gmail.com 等空格的电子邮件。

我已经尝试了很多不允许空格的代码变体,但不是在表单顶部刷新页面并显示错误消息,而是给了我这个错误:

提供的正则表达式使用多行锚(^ 或 $), 这可能会带来安全风险。您的意思是使用 \A 和 \z,还是 忘记添加 :multiline => true 选项?

【问题讨论】:

  • 缺少锚点 ^$
  • 试试这个 ^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)* @[A-Za-z0- 9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$;
  • 您是否要求您的用户验证他们的电子邮件地址?
  • 'ab c@gmail.com' =~ /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i => nil - 这不是正则表达式。奇怪的是,当您正在使用它时,您会收到建议使用 \A\z 的警告。您确定警告来自带有该正则表达式的验证吗?发布更多你的模型类是值得的。
  • PS:你可能想从 Devise gem 中借用正则表达式:/\A[^@\s]+@([^@\s]+\.)+[^@\W]+\z/ 这样你就不必担心它是否正确。

标签: ruby-on-rails regex


【解决方案1】:

您缺少开始和结束锚标记,因此您可以参考此链接Regular expressions with validations in RoR 4,您的正确正则表达式将是,

/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i

您也应该尝试使用此正则表达式进行电子邮件验证,此正则表达式将满足您的所有要求并检查所有可能的验证。

^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$

这里是正则表达式的解释,这将有助于理解验证

^           #start of the line
  [_A-Za-z0-9-\\+]+ #  must start with string in the bracket [ ], must contains one or more (+)
  (         #   start of group #1
    \\.[_A-Za-z0-9-]+   #     follow by a dot "." and string in the bracket [ ], must contains one or more (+)
  )*            #   end of group #1, this group is optional (*)
    @           #     must contains a "@" symbol
     [A-Za-z0-9-]+      #       follow by string in the bracket [ ], must contains one or more (+)
      (         #         start of group #2 - first level TLD checking
       \\.[A-Za-z0-9]+  #           follow by a dot "." and string in the bracket [ ], must contains one or more (+)
      )*        #         end of group #2, this group is optional (*)
      (         #         start of group #3 - second level TLD checking
       \\.[A-Za-z]{2,}  #           follow by a dot "." and string in the bracket [ ], with minimum length of 2
      )         #         end of group #3
$           #end of the line

测试输出:

Email is valid : abc@yahoo.com , true
Email is valid : abc-100@yahoo.com , true
Email is valid : abc.100@yahoo.com , true
Email is valid : abc111@abc.com , true
Email is valid : abc-100@abc.net , true
Email is valid : abc.100@abc.com.au , true
Email is valid : abc@1.com , true
Email is valid : abc@gmail.com.com , true
Email is valid : abc+100@gmail.com , true
Email is valid : abc-100@yahoo-test.com , true
Email is valid : abc , false
Email is valid : abc@.com.my , false
Email is valid : abc123@gmail.a , false
Email is valid : abc123@.com , false
Email is valid : abc123@.com.com , false
Email is valid : .abc@abc.com , false
Email is valid : abc()*@gmail.com , false
Email is valid : abc@%*.com , false
Email is valid : abc..2002@gmail.com , false
Email is valid : abc.@gmail.com , false
Email is valid : abc@abc@gmail.com , false
Email is valid : ab c@gmail.com , false
Email is valid : abc@gmail.com.1a , false

【讨论】:

  • 问题中的正则表达式不是问题,它已经拒绝'ab c@gmail.com'。将正则表达式更改为其他内容不会解决问题中概述的行为。此外,此正则表达式将拒绝有效的非拉丁字母域和一些有效的 gTLD 域。
  • @LucasNelson,我检查了正则表达式也只有开始和结束锚点丢失,所以他可以参考这个链接stackoverflow.com/questions/17759735/…,在这里我放了更多的电子邮件验证案例。
【解决方案2】:

检查一下:

/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i

【讨论】:

  • 这不能回答问题,因为问题中列出的正则表达式已经拒绝“ab c@gmail.com”。它也过于严格,将禁止来自非拉丁字母域和一些通用顶级域的电子邮件地址。
  • @Lucas 我刚刚检查过了。它也适用于您的输入和其他输入。在 rubular.com 上检查。你能重新检查一下吗
  • 我不是说它不是一个有效的正则表达式,我是说它无助于回答原来的问题(因为你和原来的问题都拒绝'ab c@gmail.com') ,并且对域部分的假设会使事情变得更糟。另见stackoverflow.com/a/25982750。例如,'webmaster@robsullivan.estate' =~ /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i => nil……但这是一个有效的电子邮件地址。
【解决方案3】:

您可以使用URI::MailTo::EMAIL_REGEXP

【讨论】:

    【解决方案4】:

    请尝试此正则表达式一次。我试过这个正则表达式解决了空格检查,无效的“@”或“。”字符(大部分是重复的)。

    ^(?=.{0,64}@(\S))[A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)*[^-][A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{1,})(\S)$
    

    希望能解决问题。

    希望改进cmets。

    【讨论】:

      【解决方案5】:

      用不同的字符串尝试你的正则表达式表明它does_not接受看起来像带空格的电子邮件

      'abc@google.com' =~ /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
        => 0
      
      'a abc@google.com' =~ /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
        => nil
      
      'abc a@google.com' =~ /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
        => nil
      
      'ab@goo gle.com' =~ /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
        => nil
      

      但是,正则表达式存在一些问题。 这些字符串不应是有效匹配项,但它们是:

      'a@google..com' =~ /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
        => 0
      
      'first..last@google..com' =~ /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
        => 0
      

      这个正则表达式避免了这个问题: (请注意 . 需要转义!)

       /\A([\w+\-]+\.)+[\w+\-]+@([a-z\d\-]+\.)+[a-z]+\z/i
      

      但还是不够通用。

      您可能需要检查此问题以改进正则表达式:

      What characters are allowed in an email address?

      但是,您可能需要考虑以下情况:

      不要使用正则表达式验证电子邮件,而是通过要求用户单击您发送给他/她的确认电子邮件中的链接来隐式验证

      要实现确认电子邮件,您可以使用 Devise Confirmable 或手动构建:Rails - Add Email Confirmation to Registration System

      确认电子邮件比尝试为世界上所有电子邮件地址找到完美的正则表达式更容易、更直接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-27
        • 2021-12-18
        • 2012-06-29
        相关资源
        最近更新 更多