今天在做Email发送测试时发现总是有部份邮箱发送报异常,仔细检查后发这些异常的邮箱都是包含中文及全角字母的邮箱,经过一番检查,发现验证Email格式的方法不能区分包含中文的邮箱地址。这个验证方法的正则与ASPX网页中的验证方法是一样的,而网页中的邮箱验证是没问题的,为什么这个C#写的方法就是通不过呢?
反复测试才发现正则验证中要加RegexOptions.ECMAScript选项才能区分中文,ASP.NET网页中的验证实际是Javascript正则验证的,所以能正常判断。由于平时客户端测试时都正常所以服务器端的验证就很容易被忽略了。
估计很多朋友们的系统都存在这个BUG,刚测试了一下几个网站都存在这样的问题,包括博客园也有这个问题,DUDU要关注一下(只要禁用客户端脚本在注册用户时就能用包含中文的邮箱注册成功,当然不光只是邮箱验证,其它关系到类似正则验证的都可能存在此问题)
代码如下:
Code
//无法判断:中文@domain.com
public bool IsEmail(string str)
{
if (str == null || str.Trim().Length == 0)
return false;
return Regex.IsMatch(str.Trim(), @"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");
}
//正确的写法
public bool IsEmail(string str)
{
if (str == null || str.Trim().Length == 0)
return false;
return Regex.IsMatch(str.Trim(), @"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$", RegexOptions.ECMAScript);
}
//无法判断:中文@domain.com
public bool IsEmail(string str)
{
if (str == null || str.Trim().Length == 0)
return false;
return Regex.IsMatch(str.Trim(), @"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");
}
//正确的写法
public bool IsEmail(string str)
{
if (str == null || str.Trim().Length == 0)
return false;
return Regex.IsMatch(str.Trim(), @"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$", RegexOptions.ECMAScript);
}