验证Javascript中的电子邮件地址,并与非ASCII字符兼容

use*_*627 3 javascript regex email-validation internationalization non-ascii-characters

有许多可用于验证电子邮件地址的正则表达式,但其中大多数与非ASCII字符不兼容。电子邮件地址包含非ASCII字符(如“ R ?????? @ ??????????????????????”)后 或“ ??? @ ?????????????。??”,他们无法正确识别。如何构造用于验证电子邮件地址并与非ASCII字符兼容的正则表达式?

bho*_*nes 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
Run Code Online (Sandbox Code Playgroud)

为了使其适用于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>
Run Code Online (Sandbox Code Playgroud)


Paw*_*yda 5

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

你当然想知道为什么。

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

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

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