电子邮件验证javascript

时间:2010-05-06 18:59:13

标签: javascript html validation email-validation

这个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;
    }
}

编辑:所有答案都表示赞赏!谢谢!

8 个答案:

答案 0 :(得分:7)

电子邮件地址在RFC 5322, § 3.4中定义。相关的非终端是addr-spec。由于域规范的复杂性和支持旧的,过时的形式,这个定义有点古怪。但是,您可以使用以下方法对大多数表单进行过度近似:

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

请注意,有很多合法字符。大多数注册表都会出错。是的,所有这些字符在电子邮件地址中都是合法的。

这个正则表达式不会匹配一些非常罕见的使用形式,如"noodle soup @ 9"@[what the.example.com] - 这是一个合法的电子邮件地址!

答案 1 :(得分: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("name@yahoo.com"))
{
  echo "valid";
}
else
{
   echo "aaa";
};

答案 2 :(得分:2)

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

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. 检查每个可能的.之间是否有一些字符。
  4. 伪造一个虚假的电子邮件地址仍然很容易,但这样我们确保它至少以某种方式正确格式化。我能想到的唯一问题是@内部注释,根据RFC的说法应该是完全合法的,但是这段代码会将其视为错误。
    拥有正常电子邮件地址的普通互联网用户不会失败。那么实际重要的是由你来决定;)

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

答案 3 :(得分:1)

没有。它假定电子邮件地址只能包含一个@。我建议阅读this article

您可能还需要\.而不是.

答案 4 :(得分: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

答案 5 :(得分:1)

这是与RFC相对应的正则表达式,也不包括过时的表单。我已将其分解为组件,以便于阅读:

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

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

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

这与在@之后使用引用形式的电子邮件地址或之后使用括号格式的电子邮件地址不匹配,但是虽然这些表单是有效的,但它们现在几乎没有见过示例,并且它们使正则表达式显着复杂化。

答案 6 :(得分:1)

验证电子邮件地址非常困难。除了对@.个字符进行非常基本的检查之外,它甚至不值得在客户端进行验证。

Section 3.4.1 of RFC 5322详细阐述了各种各样的法律角色,你会发现创建一个防弹正则表达式几乎是不可能的。

我最终放弃了验证,因为我偶尔会收到用户的抱怨,说他们疯狂的电子邮件地址不起作用。所以,从现在开始,我只是尝试发送电子邮件,希望它能够得到传递。如果它无法发送,那么我告诉用户他们的电子邮件地址是有问题的。

答案 7 :(得分:0)

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

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