Javascript 我们可以假设什么是无效的电子邮件地址?

Javascript 我们可以假设什么是无效的电子邮件地址?,javascript,regex,email-validation,Javascript,Regex,Email Validation,我正在尝试验证电子邮件地址,但是我想要最宽松的验证,因为我打算通过向用户发送验证电子邮件来支持这一点(我知道这会被问到很多问题,但其他问题的重点是尽可能严格,而我正试图确定最宽松的检查) 我仍然认为重要的是要有一定程度的验证来删除那些不可能是电子邮件地址的东西。。。我不想“这不是@n email.fool”沾沾自喜地坐在我的数据库里假装是一封电子邮件。虽然我很高兴拥有“this.is.not.an。email@fool.com“ 以下是我目前的功能: function validate(emai

我正在尝试验证电子邮件地址,但是我想要最宽松的验证,因为我打算通过向用户发送验证电子邮件来支持这一点(我知道这会被问到很多问题,但其他问题的重点是尽可能严格,而我正试图确定最宽松的检查)

我仍然认为重要的是要有一定程度的验证来删除那些不可能是电子邮件地址的东西。。。我不想
“这不是@n email.fool”
沾沾自喜地坐在我的数据库里假装是一封电子邮件。虽然我很高兴拥有
“this.is.not.an。email@fool.com“

以下是我目前的功能:

function validate(email) {
  var atIndex = email.lastIndexOf('@');
  // Make sure email contains an '@' character and that it is neither the first or last character
  if (atIndex > 0 && atIndex < email.length -1) {
    // Everything before the last '@' character
    var local = email.substring(0, atIndex);
    // Everything after the last '@' character
    var domain = email.substring(atIndex + 1, email.length);
    var dotIndex = domain.lastIndexOf('.');

    // Make sure domain contains a '.' character and that it is neither the first or last character
    if (dotIndex > 0 && dotIndex < domain.length - 1) {
      // Array of strings that aren't allowed to appear in a domain
      var domainRestrictions = [
        "..",
        " "
      ];
      var i = domainRestrictions.length;
      while (i-- > -1) {
        if (domain.indexOf(domainRestrictions[i]) > -1) {
          return false;
        }
      }
      // Array of strings that the local portion can neither start or end with
      var localRestrictions = [
        ".",
        " "
      ];
      i = localRestrictions.length;
      while (i-- > -1) {
        var string = localRestrictions[i];
        if (local.indexOf(string) == 0 || local.lastIndexOf(string) == local.length - 1) {
          return false;
        }
      }

      return true;
    }

  }
  return false;
}
功能验证(电子邮件){
var atIndex=email.lastIndexOf('@');
//确保电子邮件包含“@”字符,并且不是第一个或最后一个字符
如果(atIndex>0&&atIndex0&&dotIndex-1){
if(domain.indexOf(domainRestrictions[i])>-1){
返回false;
}
}
//本地部分不能以其开头或结尾的字符串数组
var localRestrictions=[
".",
" "
];
i=localRestrictions.length;
而(i-->-1){
var string=localRestrictions[i];
if(local.indexOf(string)==0 | | local.lastIndexOf(string)==local.length-1){
返回false;
}
}
返回true;
}
}
返回false;
}
目前,我不允许以下行为:

  • 没有“@”符号的任何内容
  • 不包含“.”或将其作为第一个或最后一个字符的任何域
  • 任何包含空格或“..”的域任何以“.”或空格开头或结尾的本地节
其他一切都被认为是有效的并被传递


我的问题是,是否有任何有效的电子邮件地址,这将窒息?还有什么更安全的假设是电子邮件地址不能包含的吗?

如果使用正则表达式,麻烦会小得多。有一些电子邮件验证模式可以验证您的电子邮件地址

Pattern pattern = Pattern.compile("([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4})?");
Matcher matcher = pattern.matcher(yourEmailAddress);
if(matcher.matches()){
  //do something
}else {
  //tell the user it didn't match
}

如果你绝对想拥有一个100%有效的电子邮件地址,对于初学者,我建议阅读RFC2822,可以在。本规范的全面实施将确保输入的所有电子邮件地址采用完全有效的格式。这远远超出了除最复杂的正则表达式之外的所有正则表达式所能实现的功能—例如,您可能会发现需要处理西里尔、希腊或Unicode字符集

然而

与您节省的时间相比,此规范的实现将花费大量的时间。即使电子邮件地址的格式仍然有效,仍然存在以下问题:

  • 域名可能未注册
  • 域可能没有MX记录
  • 域可能没有记录,这是一种退步;或者
  • 用户可能实际上并不存在

坦率地说,与其花时间确保电子邮件地址严格遵守正确的格式,不如花时间确保其“足够好”,并将精力集中在验证过程的其他方面。

请在以下位置查看一组详尽的规则-


RFC中没有要求域包含“.”。这不是问题的答案,但我个人认为“这不是@n电子邮件,哑巴”和“不是.a”之间没有区别。real@email-地址:lol”。如果有人不想提供一个真实的电子邮件地址,他们只需要编造一个。电子邮件验证的唯一好处是它可以捕获用户可能会犯的不必要的打字错误。@AdrianWragg如何向这样的域发送电子邮件?我假设这只会发生在
localhost
?@NabilKadimi限制太严格了,作者自己承认这会阻塞一些有效的电子邮件地址。如果它可以存在,我会让他们使用它。虽然据我所知,我不能读/写正则表达式,但这些限制太多了。我还喜欢使用我自己可以维护的代码片段(如有必要)。@rouce顶级域不再限于2-4个字符,因为ICANN开始发放通用TLD的许可证。@Georgeith您应该真正学会如何读写正则表达式。这是一项非常有用的技能,尽管即使是有经验的人也很难阅读。问题是(除非你达到非常复杂的级别),每个正则表达式都有例外。test@sample..com在这个表达式下是“有效的”。@Philipp它确实在我的待办事项列表上,每次我对一个新项目有了想法,它就会被往后推。我有一个非常基本的理解,例如什么是
[]
+
*
但仅此而已。