邮箱验证之我见

邮箱的正则表达式是什么?^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$,不过很明显abc@abc.abc这样的非正常域名后缀的也可以通过。那^[_a-z0-9-]+(\.[_az0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.(com|cn|org|……))$,列出所有的域名后缀,那也不太现实,并且像.中国这样的非英文字母域名后缀也无法匹配。

回到邮箱的格式,邮箱需要注意的格式

  • 用户名包括大小写字母、阿拉伯数字、下挂线_、减号-、点号.等

  • 用户名开始和结束不能为点号.

  • 不能出现两个相邻的点号.

不过网上提供注册的邮箱服务,比如163还有用户名6-18位,不能含点号等要求。

那该怎么验证呢?好在PHP里的过滤器Filter已经提供验证邮箱的功能

1
filter_var($email, FILTER_VALIDATE_EMAIL)

验证不通过则会返回false,这样验证倒是省力了不少。想知道这个函数是怎么实现验证的,如果是正则的话,表达式会是什么。找啊找,戳鸟哥的Github

/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD

呃呃,也就是欣赏一下,,到这一步已经绝望了。。

不过换个角度想一下,为什么要验证邮箱?邮箱验证的严格性有多大?邮箱是在用户注册的时候发送验证信息的,如果用户恶意填写,结果是自己无法通过验证。个人觉得,一般情况下对邮箱做一些必要的合理性验证,特殊字符过滤等也就足够了。

简单学习一下PHP Filter系列函数

filter_var(variable, filter, options)

获取一个变量,并进行过滤。参数一为需要过滤的变量;参数二为过滤器的ID,常用的ID有FILTER_VALIDATE_EMAIL FILTER_VALIDATE_URL FILTER_VALIDATE_IP等;参数三可选,规定包含标志的数组。

filter_has_var(type, variable)

检查是否存在指定输入类型的变量,第一个参数为检查的类型,具体分为INPUT_POST INPUT_GET INPUT_COOKIE INPUT_SERVER等,成功返回true,失败false。

filter_input(input_type, variable, filter, options)

用于对来自非安全来源的变量进行验证,来源包括POST GET COOKIE SESSION等。参数一为来源的类型,二为验证变量,三为过滤器ID,四同上数组。如果邮箱是POST过来的,则上述的验证可以改为

filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL)

此外还有filter_var_array(array, args)filter_input(input_type, args)与上述的两个区别在于可以对多个变量进行过滤。

Just a beginner.<br /><a href='https://github.com/yaoshanliang/about' target='_blank'>profile</a>