Rails正则表达式电子邮件验证,不允许空格

时间:2016-03-16 04:04:51

标签: ruby-on-rails regex

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

ab c@gmail.com

问题是它仍然接受包含public class SelectedDate{ public DateTime BirthDay {get;set;} } 空格的电子邮件。

我尝试了很多不允许使用空格的代码变体,但是它没有使用表单顶部的错误消息刷新页面,而是给出了这个错误:

  

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

5 个答案:

答案 0 :(得分:3)

您缺少开始和结束锚标记,因此您可以引用此链接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

答案 1 :(得分:0)

检查一下:

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

答案 2 :(得分:0)

尝试使用不同字符串的正则表达式表明它_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?

但是,我们认为您可能需要考虑:

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

要实施确认电子邮件,您可以使用Devise确认或手动构建:https://www.youtube.com/watch?v=EycP9L_x5rE

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

希望能解决问题。

希望改进意见。