0

在便携式应用程序(特别是现代 UI 应用程序)中验证电子邮件的好方法是什么?我不想重新发明轮子,我也不是非常热衷于使用正则表达式墙。

我个人的问题是我在服务器端进行了验证,但我想在客户端进行一些验证。

以下是针对非便携式应用程序的建议方法: 如何:验证字符串是否采用有效的电子邮件格式 如果DomainMapper()省略,则可以将其复制到便携式上下文中,但是如何最好地解开 DomainMapper 呢?这是我最喜欢的解决方案,因为就我个人而言,我可以接受一些通过我的客户传递的无效电子邮件地址。

另一种方法是从 中捕获异常System.Net.MailAddress,这在可移植上下文中也不支持。(我认为是MS推荐的方式)

有谁知道任何其他合适的解决方案?链接方法(无 DomainMapper)是最好的吗?如果是这样,有没有办法在可移植的上下文中重新实现 DomainMapper?

4

1 回答 1

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;
        }
    }
}
于 2014-07-10T09:39:54.543 回答