3

有许多正则表达式可用于验证电子邮件地址,但其中大多数与非 ASCII 字符不兼容。一旦电子邮件地址包含非 ASCII 字符,如“Rδοκιμή@παράδειγμα.δοκιμή”或“管理员@中国互联网络信息中心。中国”,他们就无法正确识别。如何构造一个用于验证电子邮件地址并与非 ASCII 字符兼容的正则表达式?

4

3 回答 3

5

根据这个来源,不通过其 RegExp 类提供任何 Unicode 支持的 JavaScript 确实支持 \uFFFF 以匹配单个 Unicode 代码点作为其字符串语法的一部分。
因此,为了定义 Unicode 字符的匹配,应该创建一组 \uXXXX 符号。此处列出的插件可以创建 Unicode 正则表达式,并可用于在使用XRegExp JavaScript 库时定义 Unicode 正则表达式。

这是测试有效 ASCII 电子邮件地址的函数:

/**
 * Checks if string contains valid email address as described
 * in RFC 2822: http://tools.ietf.org/html/rfc2822#section-3.4.1
 * This function omits the syntax using double quotes and square brackets
 * @return {Boolean}    True, if test succeeded.
 */
String.prototype.checkEmail = function()
{
    var reEmail = /^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;
    return reEmail.test(this);
}

// Usage example
alert( "some_valid_email@somewhere.com".checkEmail() ); // true
alert( "invalid_email.com".checkEmail() ); // false

为了使其适用于 Unicode 字符串,可以包含 XRegExp 库并\\p{L}使用a-z. 这是完整的代码:

<!DOCTYPE html>
<html>
<head>
    <script src="xregexp-all-min.js"></script>
    <script>
        /**
         * Checks if string contains valid email address as described
         * in RFC 2822: http://tools.ietf.org/html/rfc2822#section-3.4.1
         * This function omits the syntax using double quotes and square brackets
         * @return {Boolean}    True, if test succeeded.
         */
        String.prototype.checkEmailX = function()
        {
            var reEmail = XRegExp("^[\\p{L}0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[\\p{L}0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[\\p{L}0-9](?:[\\p{L}0-9-]*[\\p{L}0-9])?\.)+[\\p{L}0-9](?:[\\p{L}0-9-]*[\\p{L}0-9])?$");
            return reEmail.test(this);
        }

        alert( "true = " + "Rδοκιμή@παράδειγμα.δοκιμή".checkEmailX() ); // true
        alert( "true = " +"管理员@中国互联网络信息中心.中国".checkEmailX() ); // true
        alert( "true = " +"test@test.am".checkEmailX() ); // true
        alert( "false = " +"test_test.am".checkEmailX() ); // false
        alert( "true = " +"test@ράδ.am".checkEmailX() ); // true
    </script>
</head>
<body>
</body>
</html>
于 2012-10-21T18:24:05.627 回答
4

我不得不写一些关于如何使用正则表达式验证电子邮件地址的文章。不幸的是,结果是无法以这种方式验证电子邮件地址

你当然想知道为什么。

  1. 查看Wikipedia 文章中的有效电子邮件地址示例。编写能够满足所有这些标准的正则表达式几乎是不可能的。
  2. 当然,您已经了解原生顶级域。这就是你提问的原因。但是,您可能没有意识到,除了“标准”国家顶级域名之外,我们这里可能还有任何名称。它是一个移动的目标,所以...
  3. 没有所有域注册机构都遵循的特定政策。我发现,例如,日本注册表允许使用表意句号(全角和半角)作为标签分隔符。我不知道它是如何工作的,但这是他们允许的。此外,事实证明,日本和中国的注册机构在最大标签长度方面存在差异。我看不出如何使用正则表达式对其进行验证。

那么我们如何验证电子邮件呢?一种想法是简单地询问给定域的 MTA 是否存在(这在前端无法完成,即使用客户端 JavaScript)。不幸的是,它带来了 DOS 攻击的风险,所以这不是最好的主意。当然,您不会知道该地址在给定服务器上是否有效。为此,您需要连接到服务器并发出 VRFY 命令,但由于垃圾邮件发送者,大多数服务器会回复“550 No such user”。

如果验证的目的仅仅是为了避免用户的错误,您可能需要添加额外的字段并让用户重新输入电子邮件(这也不是最好的主意)。

于 2012-10-21T20:07:16.367 回答
4

请不要把事情复杂化。

花点时间想想你为什么需要它。很可能是因为您想向用户发送电子邮件,对吧?所以我提倡最简单的电子邮件验证正则表达式:

/@/

完毕。它将验证所有有效的电子邮件地址。它还会错误地验证许多看起来像一个但实际上并不有效的东西,但大多数错误要么没有填写表单字段,要么混淆了字段并在其他字段中输入了错误的内容。

此外,您还会注意到电子邮件地址是否无效,因为您的邮件被退回。并且地址的存在是任何正则表达式都无法为您做的事情。

于 2012-10-21T18:27:42.597 回答