问题

多年来,我慢慢开发了一个正则表达式,可以正确验证MOST电子邮件地址,假设他们不使用IP地址作为服务器部分.

我在几个PHP程序中使用它,它在大多数时间工作.但是,我有时会遇到有人使用它的网站遇到问题,我最终不得不进行一些调整(最近我意识到,我不允许4字符TLD).< p>

我见过几个使用函数的解决方案,这些函数使用了几个较短的表达式,但我宁愿在一个简单的函数中使用一个长的复杂表达式,而不是在一个更复杂的函数中使用多个短表达式.



解决方法

这个问题没有简单的正则表达式:see 这是完全符合RFC-822的正规表达式,这只是简单的. (它是在语法模式之前写的.) RFC 5322 中指定的语法是对于原始正则表达式来说太复杂.

Perl,PCRE和PHP中更复杂的语法模式可以管理以正确解析RFC 5322而不需要搭便车. Python和C#也应该能够管理它,但他们使用与前三个不同的语法.然而,如果你被迫使用许多不太强大的模式匹配语言之一,那么最好使用一个真正的解析器.

同样重要的是要了解,根据RFC验证它是绝对没有关于该地址是否实际存在于提供的域,或输入地址的人是否是其真正的所有者.人们签署他人,直到邮件列表这种方式一直.修复需要一种类型的验证,其涉及向该地址发送包括确认令牌的消息,该确认令牌意图在与该地址相同的网页中输入.

确认令牌是了解您获取进入该地点的人的地址的唯一方法.这就是为什么大多数邮件列表现在使用该机制来确认注册.毕竟,任何人都可以放下 president@whitehouse.gov ,甚至会解析为法律,但它不太可能是另一端的人.

对于PHP,您应该不要使用验证E-邮件地址与PHP,正确的方式,我从中引用:

There is some danger that common usage and widespread sloppy coding will establish a de facto standard for e-mail addresses that is more restrictive than the recorded formal standard.

这并不比所有其他非RFC模式更好.它甚至不够聪明,甚至不能处理 RFC 822 ,更不用说RFC 5322. < a href ="http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses/1917982#1917982">然而,这一个,是.

如果你想获得花哨和诡异,实现完整状态引擎.正则表达式只能作为一个基本的过滤器.正则表达式的问题是告诉别人他们完全有效的电子邮件地址是无效的(假阳性),因为你的正则表达式不能处理它从用户的角度来说是粗鲁和无礼.用于该目的的状态引擎可以验证并且甚至校正电子邮件地址,否则该电子邮件地址将根据每个RFC分解电子邮件地址而被认为是无效的.这允许潜在的更令人愉快的体验,如

The specified e-mail address 'myemail@address,com' is invalid. Did you mean 'myemail@address.com'?

另请参阅验证电子邮件地址,包括评论.或比较验证正则表达式的电子邮件地址.

正则表达式可视化

Debuggex演示




相关问题推荐