c语言实现邮箱地址验证


rfc中是这样定义邮箱格式的:

     address     =  mailbox                      ; one addressee
                 /  group                        ; named list

     group       =  phrase ":" [#mailbox] ";"

     mailbox     =  addr-spec                    ; simple address
                 /  phrase route-addr            ; name & addr-spec

     route-addr  =  "<" [route] addr-spec ">"

     route       =  1#("@" domain) ":"           ; path-relative

     addr-spec   =  local-part "@" domain        ; global address

     local-part  =  word *("." word)             ; uninterpreted
                                                 ; case-preserved

     domain      =  sub-domain *("." sub-domain)

     sub-domain  =  domain-ref / domain-literal

     domain-ref  =  atom                         ; symbolic reference

感觉说的不是很清楚,在附录中有更详细的说明.尝试了几个流行的邮箱服务商,如:

网易163 => 用户名只能包含_,英文字母,数字

腾讯邮箱 => 由英文、数字、点、减号、下划线组成

gmail => 只能使用字母 (a-z)、数字 (0-9) 和数点 (.)

yahoo邮箱 =》 4至32个字符(包括字母、数字、下划线),且必须以英文字母开始

每一家的限制都不相同:

看看这个牛X的正则匹配的,可以有%,最后需要有2到4个字符作为域名的结尾,但是却没有限制整体的长度:

\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b

Options: case insensitive。

呵呵,因为c程序里要用到,于是综合上面各位写了一个c语言校验邮箱地址的函数:

bool IsValidEmail(const char* pszEmail, const char* pszTip)
{
if(pszEmail == NULL)
{
return false;
}
int iAtPos = 0;
int iLastDotPos = 0;
int i = 0;
int iAtTimes = 0;
while(*(pszEmail + i) != ‘\0′)
{
char ch = *(pszEmail + i);
if(!isprint(ch) || isspace(ch))  //空格和控制字符是非法的,限制得还比较宽松
{
iAtTimes = 0;
break;
}
if(ch == ‘@’)
{
iAtPos = i;
iAtTimes++;
}
else if(ch == ‘.’)
{
iLastDotPos = i;
}
i++;
}
if(i > 64 || iAtPos < 1 || (iLastDotPos – 2) < iAtPos ||
(i – iLastDotPos) < 3 || (i – iLastDotPos) > 5 || iAtTimes > 1 || iAtTimes == 0) //对@以及域名依靠位置来判断,限制长度为64
{
return false;
}
return true;
}
相比网上另外一个版本的校验,性能应该是有所提升的:
bool IsValidEmail(const char *s)
{
char* ms;
if ((ms=strchr(s,’@')) == NULL)
{
return false;
}
if (strchr(ms+1,’@') != NULL)
{
return false;
}
if (strchr(ms+1,’.') == NULL)
{
return false;
}
if (strchr(s,’.') < ms)
{
if (strchr(strchr(s,’.')+1,’.') < ms)
{
return false;
}
}
if (strlen(strrchr(s,’.')+1) > 4 || strlen(strrchr(s,’.')+1) < 2)
{
return false;
}
return true;
}
通过运行1000次来计算花费了多少微妙,进行了一下性能上的比较:
validemail1 test  //前一种
Time cost => 244(us), avg => 0(us)
validemail2 test //后一种
Time cost => 590(us), avg => 0(us)
总体而言,第一个校验的格式比第二个要好一倍。可见字符串的操作还是比较浪费时间的。

参考:

rfc的邮箱格式说明:http://www.freesoft.org/CIE/RFC/822/61.htm

这个网站不错:http://www.regular-expressions.info/regexbuddy/email.html


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值