regex正则表达式regexregexरेगेक्सالتعبير النمطيUpdated
正则表达式邮箱验证完全指南
学习如何使用正则表达式验证邮箱地址。从基础到高级模式,附真实案例。
作者 Korelyy Team
8 min 阅读
邮箱校验是网上被复制最多的正则,而大多数版本都错在同一个地方:把真人真实在用的合法地址判成非法。把某个模式粘进注册表单之前,值得先弄清正则在这件事上能做什么、不能做什么——因为它的失败是无声的。被误拒的用户看到一句报错,然后离开。
唯一权威的校验是「能不能送达」
地址合法,等价于「发过去的邮件能收到」。这件事没有任何正则能判断,因为能否送达取决于 DNS 记录、邮箱是否存在和服务器策略。正则做的事只有一件:在你发验证邮件之前,拦住明显的手误和格式错误。把它当过滤器,不是校验器。
实用模式该检查什么
- 恰好一个 @,两侧各至少一个字符。
- 域名里至少一个点,且 @ 前后不能紧贴点。
- 不含空格,也不含地址中明确非法的字符,比如尖括号,或引号段之外出现的逗号。
- 顶级域名至少两个字母,可以拦掉 name@company 这类误输入。
- 合理的总长度限制。实际使用中,完整地址不应超过 254 个字符。
会让粗糙模式翻车的真实情况
- 加号寻址:[email protected] 是合法的,被广泛用于邮件过滤。
- 用户名里的点:[email protected];某些服务商甚至允许连续的点,虽然少见且因服务商而异。
- 子域名:[email protected] 是非常普通的地址。
- 新顶级域名很长:[email protected] 之类是合法的,不要把结尾写死成「两个字母」。
- 大写字母和国际化域名都合法。应该统一大小写,而不是拒绝。
怎样正确测试一个模式
上线前先建一个三列表格。第一列是必须匹配的地址,包含上面那些刁钻的例子。第二列是必须拒绝的地址:缺 @、两个 @、结尾是点、含空格、用户名为空、没有顶级域名。第三列是「看起来像但不是」的输入,比如一整句话、一个电话号码、一个网址。三列全跑。只过了第一列、却把第三列匹配掉一半的模式,造成的伤害比完全不校验还大。
正则通过之后该做什么
- 存库前把域名转成小写,去掉首尾空白。
- 发送带短时效的验证链接,点击之前不把账号标为已确认。
- 给验证接口加频率限制,否则它会变成别人白用你域名发信的通道。
- 报错要具体。「请输入有效的邮箱地址」等于什么都没说,用户不知道错在哪。
用真实用例测试你的邮箱正则
粘贴模式和一组输入,立刻看到哪些匹配、哪些不匹配。