电子邮件验证 javascript

问题描述 投票:0回答:9

这个 JavaScript 函数(checkValidity)正确吗?

function checkTextBox(textBox)
{
   if (!checkValidity(textBox.getValue()))
       displayError("Error title", "Error message", textBox);
       textBox.focus();
}

function checkValidity(e) 
{
    var email;
    email = "/^[^@]+@[^@]+.[a-z]{2,}$/i";

    if (!e.match(email)){
            return false;
    else
            return true;
    }
}

编辑:所有答案都很感谢!谢谢!

javascript html validation email-validation
9个回答
7
投票

电子邮件地址在 RFC 5322, § 3.4 中定义。相关的非终结符是

addr-spec
。由于领域规范的复杂性和对旧的、过时的形式的支持,这个定义被证明有些奇怪。但是,您可以使用以下方法对大多数形式进行过度近似:

^[-0-9A-Za-z!#$%&'*+/=?^_`{|}~.]+@[-0-9A-Za-z!#$%&'*+/=?^_`{|}~.]+

请注意,有大量合法字符。大多数正则表达式的列表都是错误的。是的,电子邮件地址中的所有这些字符都是合法的。

此正则表达式不会匹配一些非常不常用的形式,例如

"noodle soup @ 9"@[what the.example.com]
——这是一个合法的电子邮件地址!


3
投票
function isValidEmail($email)
{
    return eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email);
};

if(isValidEmail("[email protected]"))
{
  echo "valid";
}
else
{
   echo "aaa";
};

2
投票

不,正则表达式不太适合这个目的。 看看这个(虽然我不能保证它的有效性)。
另外,关于脚本本身,你为什么不这样检查:

function checkEmailValidity(e) {
  return e.match("some validating regex");
}

这似乎是一个更快、更简洁、更易读的解决方案。

编辑:
值得注意的是,编写可以检测任何有效电子邮件地址的正则表达式几乎是不可能的。因此,您可能最好尝试制定一些验证算法,而不是正则表达式,因为有效的电子邮件地址可能非常非常复杂。

考虑这段代码:

function validateEmail(email) {
    if (typeof email != "string") return false;
    email = email.split("@");
    email[1] = email[1].split(".");
    if (
        email.length !== 2 ||
        email[1].length < 2 ||
        !email[1].hasValues(String)
    ) return false;
    return true;
}

// Checks whether each key in an array has a value, and (optionally) if they match a given contructor (object type).
// I.e.: myArray.hasValues(String) // checks whether all elements in myArray has a value, a nonempty string.
Array.prototype.hasValues = function(assumedConstructor) {
    for (var i = 0; i < this.length; i++) {
        if (!this[i]) return false;
        if (assumedConstructor && this[i].constructor != assumedConstructor) return false;
    }
    return true;
};

它的工作原理是这样的:

  1. 首先检查字符串是否包含一个
    @
    ,并且只有一个
  2. 检查
    @
    之后的部分是否至少有一个
    .
  3. 检查每个可能的
    .
    之间是否存在一些字符。

伪造假电子邮件地址仍然很容易,但这样我们就可以确保它至少以某种方式格式正确。我能想到的唯一问题是

@
的内部注释,根据 RFC,这应该是完全合法的,但此代码会将其视为错误。
拥有普通电子邮件地址的普通互联网用户不会失败。因此,它实际上有多重要取决于您来决定;)

最好的解决方案(如果有的话)是将地址放入某种内置方法中,该方法通过尝试使用电子邮件地址以某种方式检查有效性。


1
投票

试试这个:我确信它可以处理各种电子邮件验证。

function checkEmail(email)
{   
    if(/^([a-z]([a-z]|\d|\+|-|\.)*):(\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?((\[(|(v[\da-f]{1,}\.(([a-z]|\d|-|\.|_|~)|[!\$&'\(\)\*\+,;=]|:)+))\])|((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=])*)(:\d*)?)(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*|(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)){0})(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(email)) {
      return true;
    } else {
      return false;
    }
}

HTH


1
投票

不。它假设一个电子邮件地址只能包含一个

@
。我建议阅读这篇文章

您可能还指的是

\.
而不是
.


1
投票

这是与 RFC 相对应的正则表达式,也排除了过时的形式。我已将其分解为多个组件,以便于阅读:

IDENT = [a-z0-9](?:[a-z0-9-]*[a-z0-9])?
TEXT = [a-z0-9!#$%&'*+/=?^_`{|}~-]+

EMAIL = TEXT(?:\.TEXT)*@IDENT(?:\.IDENT)+

(注意:不区分大小写。)

这不会匹配在@之前使用引号形式或在@之后使用方括号形式的电子邮件地址,但是虽然这些形式有效,但如今除了示例之外几乎看不到它们,并且它们使正则表达式显着复杂化。


1
投票

验证电子邮件地址非常困难。除了对

@
.
字符进行非常基本的检查之外,甚至不值得在客户端进行验证。

RFC 5322第 3.4.1 节详细阐述了各种法律字符,您会发现创建防弹正则表达式几乎是不可能的。

我最终放弃了验证,因为我偶尔会收到用户的投诉,说他们疯狂的电子邮件地址不起作用。所以,从现在开始,我只是尝试发送电子邮件并希望它能送达。如果发送失败,我会告诉用户他们的电子邮件地址有问题。


0
投票

在进行几次搜索时,我发现了这一点。它基于 RFC 2822

http://snipplr.com/view/20981/


0
投票

函数 validateEmail(id) { 让 emailField = document.querySelector(

#${id}
); 让电子邮件 = emailField.value.trim();

if (email === "") {
    errors.push(`Het veld ${id} is vereist.`);
} else {
    // Use a regular expression to check the email format
    let emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    if (!emailRegex.test(email)) {
        errors.push(`Ongeldig e-mailadres. Controleer het veld ${id}.`);
    }
}

}

© www.soinside.com 2019 - 2024. All rights reserved.