c语言实现邮箱地址验证
2012-01-06 17:14
225 查看
rfc中是这样定义邮箱格式的:
感觉说的不是很清楚,在附录中有更详细的说明.尝试了几个流行的邮箱服务商,如:
网易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
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
相关文章推荐
- jquery无刷新验证邮箱地址实现实例
- js和php邮箱地址验证的实现方法
- 用JAVA代码实现验证邮箱地址是否符合
- jquery无刷新验证邮箱地址实现实例
- AJAX和WebService实现邮箱验证(无刷新验证邮件地址是否合法)
- C语言实现电子邮件地址验证程序
- 在c语言中用正则表达式实现对email地址和ip地址的验证
- php内置函数实现 验证邮箱,url地址格式是否合法
- AJAX和WebService实现邮箱验证(无刷新验证邮件地址是否合法)
- jquery formvalidator邮箱地址验证
- jQuery实现输入邮箱地址自动提示
- jQuery实现Email邮箱地址自动补全功能代码
- 邮箱地址正则表达式验证代码合集脚本之家特别版
- Jsoup+JavaMail实现自动投票,验证邮箱功能
- Flex 验证邮箱地址
- c语言实现找出字符串str2在字符串str1中的首地址
- Java实现邮箱登录验证和邮件发送
- 使用ASP验证email邮箱地址
- 【电商网站】邮箱地址及手机验证代码分析