在便携式应用程序中验证电子邮件的好方法是什么,特别是现代UI应用程序?我不希望重新发明轮子而且我不是非常热衷于使用墙壁正则表达式。
我个人的问题是我在服务器端进行了验证,但我想要一些 验证在客户端。
以下是非便携式应用的建议方法:
How to: Verify that Strings Are in Valid Email Format
如果省略DomainMapper()
,可以将其复制到便携式上下文中,但是如何最好地解开DomainMapper?这是我最喜欢的解决方案,因为在我个人的情况下我可以接受一些无效的电子邮件地址通过我的客户。
另一种方法是捕获System.Net.MailAddress
中的异常,这在便携式上下文中也不受支持。 (MS推荐的方式,我认为)
有没有人知道任何其他适当的解决方案?链接方法(没有DomainMapper)是最好的吗?如果是这样,有没有办法在便携式上下文中重新实现DomainMapper?
答案 0 :(得分:0)
通过转换为Ascii字符,以更简单的方式处理Unicode。这样你所需要的只是System.Text.RegularExpressions
,它是可移植的。
这通过了MS页面上的所有给定测试,无法想象它不那么宽松。如果有不好的电子邮件通过它不是一个大问题,因为无论如何真正的验证应该在服务器端。
public static class RegexUtilities
{
/// <summary>
/// Portible version of http://msdn.microsoft.com/en-us/library/01escwtf%28v=vs.110%29.aspx
/// More permissive validation for client side.
/// </summary>
/// <param name="strIn"></param>
/// <returns></returns>
public static bool IsValidEmail(string strIn)
{
if (String.IsNullOrEmpty(strIn))
return false;
//Replace all unicode chars with ascii "A"
strIn = Regex.Replace(strIn, "[^\x0d\x0a\x20-\x7e\t]", "A");
// Return true if strIn is in valid e-mail format.
try
{
return Regex.IsMatch(strIn,
@"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
@"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$",
RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
}
catch (RegexMatchTimeoutException)
{
return false;
}
}
}