如何在JavaScript中验证电子邮件地址?

5476

在将用户输入发送到服务器或尝试向其发送电子邮件之前,为了防止最基本的打字错误,我想在JavaScript中检查用户输入是否为电子邮件地址。 我该如何实现此目标?


23
@Alex 我添加这个评论的原因是,被接受的答案中建议的正则表达式会禁止现有的有效电子邮件地址,这对客户来说是一个很糟糕的开端。而真正大的问题是,即使地址被接受了,也不能确定它是否有效。可靠地验证提供的电子邮件地址是否有效的唯一方法是发送带有验证链接的邮件。因此,如果您的用例不要求验证电子邮件,请只进行最小限度的@测试;否则,请使用验证邮件。正则表达式只会提供糟糕的用户体验。 - David Mårtensson
7
@mikael1000,好的,但是当你根本不知道是否存在有效的电子邮件时,正则表达式验证有什么用处呢?如果您不想使用验证链接干扰客户,则只需进行最简单的验证<something> at <something>,然后就可以了。这将确保客户至少添加了可能是电子邮件的内容,除此之外的任何操作都是代码浪费,直到您实际进行验证为止。您还可以通过DNS查找来检查域名是否存在。 - David Mårtensson
2
非常相似:*如何使用正则表达式验证电子邮件地址?* - Peter Mortensen
我建议阅读这篇关于电子邮件语法如何工作的文章:https://debounce.io/blog/articles/email-syntax-error-explained/ - Iman
3
我必须承认,我不理解为什么要进行这么多验证,因为即使用户没有使用有效字符,也无法预测其是否进行了基本类型的输入。 只需在开头检查@和至少一个点即可。 - Watts Epherson
显示剩余5条评论
79个回答

21

这就是node-validator的做法:

/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/

19

不检查顶级域名的解决方案是不完整的。

几乎所有答案都建议使用正则表达式来验证电子邮件地址。我认为正则表达式只适用于基本的验证。实际上,电子邮件地址的验证似乎是两个单独的问题:

1- 验证电子邮件格式: 确保电子邮件符合RFC 5322中的格式和模式以及顶级域名是否存在。可以在此处找到所有有效TLD的列表。

例如,尽管地址example@example.ccc将通过正则表达式,但它不是有效的电子邮件,因为ccc不是IANA的顶级域名。

2- 确保电子邮件确实存在: 要做到这一点,唯一的选择向用户发送电子邮件


17

在您的验证器函数中使用此代码:

var emailID = document.forms["formName"]["form element id"].value;
atpos = emailID.indexOf("@");
dotpos = emailID.lastIndexOf(".");
if (atpos < 1 || ( dotpos - atpos < 2 ))
{
    alert("Please enter correct email ID")
    return false;
}

否则您可以使用jQuery。在内部规则中定义:

eMailId: {
    required: true,
    email: true
}

15

squirtle相比,这是一个复杂的解决方案,但它非常有效地验证了电子邮件地址:

function isEmail(email) { 
    return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(email);
} 

可以这样使用:

if (isEmail('youremail@yourdomain.com')){ console.log('This is email is valid'); }

15

var testresults

function checkemail() {
  var str = document.validation.emailcheck.value
  var filter = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
  if (filter.test(str))
    testresults = true
  else {
    alert("Please input a valid email address!")
    testresults = false
  }
  return (testresults)
}

function checkbae() {
  if (document.layers || document.getElementById || document.all)
    return checkemail()
  else
    return true
}
<form name="validation" onSubmit="return checkbae()">
  Please input a valid email address:<br />

  <input type="text" size=18 name="emailcheck">
  <input type="submit" value="Submit">
</form>


14

我对正则表达式的了解并不是很好。所以我首先使用一个简单的正则表达式来检查一般语法,然后再使用其他函数检查更具体的选项。这可能不是最好的技术解决方案,但这样我更加灵活和快捷。

我遇到的最常见错误是空格(特别是在开头和结尾)和偶尔出现双点号。

function check_email(val){
    if(!val.match(/\S+@\S+\.\S+/)){ // Jaymon's / Squirtle's solution
        // Do something
        return false;
    }
    if( val.indexOf(' ')!=-1 || val.indexOf('..')!=-1){
        // Do something
        return false;
    }
    return true;
}

check_email('check@thiscom'); // Returns false
check_email('check@this..com'); // Returns false
check_email(' check@this.com'); // Returns false
check_email('check@this.com'); // Returns true

13

验证电子邮件地址的正则表达式

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

12

这里有一个非常好的讨论,介绍如何使用正则表达式验证电子邮件地址; "比较电子邮件地址验证的正则表达式"

以下是当前排名第一的、兼容JavaScript的正则表达式,仅供参考:

/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i

现在已经非常过时了。 - Slbox

12

看来,就是这样:

/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i

引用自http://fightingforalostcause.net/misc/2006/compare-email-regex.php,发布于2010年10月1日。

当然,这忽略了国际化问题。


11

哇,有很多答案包含略微不同的正则表达式。我尝试了许多表达式,但得到了不同的结果和各种问题。

对于UI验证,我觉得最基本的检查是查找@符号。需要注意的是,我总是使用标准的“验证邮件”进行服务器端验证,其中包含一个唯一链接,用户可以确认他们的电子邮件地址。

if (email.indexOf('@') > 0)

我特意选择了0,即使基于零的计数,也可以确保在 @ 符号之前只有一个字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接