2016-03-16 64 views
3

我目前使用此代码为我的电子邮件验证:Rails的正则表达式验证电子邮件允许

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

的问题是,它仍然接受与喜欢ab [email protected]空间的电子邮件。

我已经尝试了很多代码的变化,不应该允许的空间,但而不是用在表单顶部的错误消息,刷新页面,它给了我这个错误:

The provided regular expression is using multiline anchors (^ or $), which may present a security risk. Did you mean to use \A and \z, or forgot to add the :multiline => true option?

+0

缺少锚'^'和'$'。 – Tushar

+0

试试这个^ [_A-Za-z0-9 - \\ +] +(\\。[_A-Za-z0-9 - ] +)* @ [A-Za-z0-9 - ] + 。\ [A-ZA-Z0-9] +)*(\\ [A-ZA-Z] {2,})$; –

+0

你需要你的用户来验证他们的电子邮件地址吗? –

回答

0

检查:

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

这并不回答问题,因为问题中列出的正则表达式已拒绝'ab [email protected]'。它也是过度限制性的,并且将禁止来自非拉丁字母域和一些通用顶级域的电子邮件地址。 –

+0

@Lucas我刚刚检查出来。它的输入和其他输入也很好。在rubular.com检查。你可以请重新检查它 – Ranzit

+1

我不是说这不是一个有效的正则表达式,我说它不会回答原来的问题(因为你的和原始问题都拒绝'ab [email protected]'),并且它可以使关于领域部分的假设变得更糟。另见http://stackoverflow.com/a/25982750。例如,''[email protected]'=〜/^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[AZ]{2,4}$/i => nil' ...但这是一个有效的电子邮件地址。 –

2

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

/^[A-Z0-9._%+-][email protected][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 : [email protected] , true 
Email is valid : [email protected] , true 
Email is valid : [email protected] , true 
Email is valid : [email protected] , true 
Email is valid : [email protected] , true 
Email is valid : [email protected] , true 
Email is valid : [email protected] , true 
Email is valid : [email protected] , true 
Email is valid : [email protected] , true 
Email is valid : [email protected] , true 
Email is valid : abc , false 
Email is valid : [email protected] , false 
Email is valid : [email protected] , false 
Email is valid : [email protected] , false 
Email is valid : [email protected] , false 
Email is valid : [email protected] , false 
Email is valid : abc()*@gmail.com , false 
Email is valid : [email protected]%*.com , false 
Email is valid : [email protected] , false 
Email is valid : [email protected] , false 
Email is valid : [email protected]@gmail.com , false 
Email is valid : ab [email protected] , false 
Email is valid : [email protected] , false 
+0

问题中的正则表达式不是问题,它已经拒绝'ab [email protected]'。将正则表达式更改为其他内容不会解决问题中概述的行为。此外,此正则表达式将拒绝有效的非拉丁字母域名和一些有效的gTLD域名。 –

+0

@LucasNelson,我检查了正则表达式也只有开始和结束锚缺失,所以他可以参考这个链接http://stackoverflow.com/questions/17759735/regular-expressions-with-validations-in-ror-4和在这里我正在更多的电子邮件验证案例。 –

0

尝试了用不同的字符串正则表达式表明, _does_not_接受看起来像空格邮件的东西

'[email protected]' =~ /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    => 0 

'a [email protected]' =~ /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    => nil 

'abc [email protected]' =~ /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    => nil 

'[email protected] gle.com' =~ /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    => nil 

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

'[email protected]' =~ /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    => 0 

'[email protected]' =~ /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    => 0 

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

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

,但它仍然是不够一般。

你可能要检查这个问题,以改善正则表达式:

What characters are allowed in an email address?

然而,这里被认为有可能要用考虑:

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

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

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

0

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

相关问题