现在许多网站都采用了通过邮箱账号来注册用户名的方式,一来可以避免重复,而来安全性也得到保证,一举两得,很不错。
而最近HCI的官网也要重构了,部门一女生在写注册信息的表单验证的时候遇到了许多问题,其中一个就是邮箱的验证。
老实说,一开始俺就觉得邮箱验证本身就不难,不就一个正则表达式的匹配问题么,自己不会写也可以去网上找到啊。
可是等看了妹子在网上找到的邮箱正则匹配的代码之后,我自己也去谷歌了一下,发现好多所谓的“网友”写的匹配式真的是漏洞百出。没有一个符合我自己的要求的(可能我太严格了= =),于是我就打算花上个十几分钟写个匹配邮箱的正则表达式。
说实话,做跟说完全是两码事,本来我以为这么一个表达式也就几分钟的事情,结果愣是让我耗上了快半个多小时。现在让我来总结一下我遇到的问题。
a)邮箱地址后缀是提供邮箱服务商的域名后缀(也就是符号”@“后面的内容),千奇百怪,而且很多域名后缀也在不断的更新,无法做到绝对匹配,所以我这里也无能为力
b)对于符号“@”前面的字段,我们是有足够把握做到绝对的匹配的,因为事实上要验证的规则”不多“
c)为什么”不多“加了引号呢?因为其实规则真心挺多的。首先,不同的邮箱服务提供商对自己的邮箱命名规则就没有一个统一的标准。163邮箱允许字母+数字+下划线,而对下划线的个数已经重复方式也没有严格规定,所以也就导致了有类似于“a______v@163.com”这样的邮箱地址。而谷歌邮箱更是奇葩,它居然不支持下划线,却支持英文句点“.”,如果你不介意,你完全可以注册一个类似于“a.b.c.d.e.f@gmail.com"的邮箱。所以,邮箱格式的多样化就造成了正则表达式可能会比较复杂。
d)不过好消息是,无论是国内的163还是国外的谷歌,都不允许符号字符开头或结尾。这给了我们一个十分良好的信息。因为那样我们就可以放心地关注字符串中间的那些字符的匹配了(因为开头和结尾必定是数字或字母)。
e)网上许多网友写的邮箱正则表达式都很不严谨,居然能匹配到"___a___@163.com""abc@kkk.com.com.com.com"这类奇葩的邮箱地址。这是我不能忍受的。
综上所述,我纠结了半个多小时之后终于将比较严谨的正则表达式憋出来了:
/^[a-zA-Z0-9]([a-zA-Z0-9]|_+[a-zA-Z0-9]|[a-zA-Z0-9]*\.[a-zA-Z0-9])+@\w+\.[a-zA-Z]{1,4}\.{0,1}[a-zA-Z]{0,4}$/
总结:本人乃小菜一颗,上述的表达式纯属个人见解,若各位大神有更好的匹配式,欢迎指点。PS:对于邮箱的域名后缀的匹配本人实在无能为力,如果有知道如何解决的大神,请赐教,感激不尽!
原文链接:https://www.f2er.com/regex/362777.html