4

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

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

4

8 回答 8

7

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

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

请注意,有大量的合法字符。大多数 reg-ex 都把列表弄错了。是的,所有这些字符在电子邮件地址中都是合法的。

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

于 2010-05-06T19:31:51.167 回答
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";
};
于 2010-05-06T19:24:09.420 回答
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,这应该是完全合法的,但这段代码会将其视为错误。
拥有正常电子邮件地址的普通互联网用户不会失败。所以它到底有多重要由你来决定;)

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

于 2010-05-06T19:08:10.230 回答
1

不可以。它假定一个电子邮件地址只能包含一个@. 我建议阅读这篇文章

您可能还表示\.代替..

于 2010-05-06T19:03:33.403 回答
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;
    }
}

高温高压

于 2010-05-06T19:06:40.590 回答
1

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

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

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

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

这与在 @ 之前使用引号形式或在其之后使用方括号形式的电子邮件地址不匹配,但是虽然这些形式是有效的,但它们现在在示例之外几乎从未见过,并且它们使正则表达式变得非常复杂。

于 2010-05-06T19:40:14.583 回答
1

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

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

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

于 2010-05-06T19:40:58.143 回答
0

在进行几次搜索时,我遇到了这个。它基于 RFC 2822

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

于 2013-05-29T07:55:11.970 回答