JavaScript 正则表达式邮箱验证

152

这段代码总是弹出一个 "null",这意味着该字符串与表达式不匹配。

var pattern = "^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$"; 

function isEmailAddress(str) {

    str = "azamsharp@gmail.com";      

    alert(str.match(pattern)); 
    return str.match(pattern);    

}

7
电子邮件验证很困难。实用上,你只能假设电子邮件地址中包含一个“@”符号,并且紧随其后的某处至少有一个“.”符号,但如果你想避免排斥一些用户,就只能做到这些了。除非你正在验证特定域名下的电子邮件,因为在那种情况下,电子邮件命名规则更加规范。 - AnthonyWJones
1
严格来说,你甚至不能假设有一个“.”出现在某个地方。例如,可以看看ua ccTLD,在顶级拥有MX记录。 - user1311045
为什么你不能在表单中使用type =“email”?@azamsharp - PT_C
16个回答

109

如果您将正则表达式定义为字符串,则所有反斜杠都需要转义,因此您应该使用'\\w'而不是'\w'。

或者,将其定义为正则表达式:

var pattern = /^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$/; 

顺便提一下,请不要在客户端验证电子邮件地址。无论如何,您的正则表达式都太简单了,无法通过一个可靠的实现。

在此处查看真正的内容:http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html


41
这个正则表达式不支持类似于john.smith@gmail.com这样的地址。 - Nadia Alramli
6
它不支持像emailadd@gmail.com.sa这样的电子邮件。 - Amr Badawy
6
为什么电子邮件地址不应该在客户端进行验证?毕竟,在客户端进行验证是一种更快的验证方式,因为我们不需要跨网络进行多次HTTP请求来验证数据(这对于可能通过缓慢的Wifi或移动网络联系服务器的移动应用程序尤其重要)。 - Ciaran Gallagher
1
这将不支持像以下这样的电子邮件地址: bob+tag@gmail.combob@foo123.combob.sagat@gmail.com(正如Nadia Alramli已经指出的那样)。 - Aneil Mallavarapu
2
这个表达式还有很多需要改进的地方:1)禁止使用许多有效的用户名字符,例如破折号和加号;2)禁止使用许多ccTLD中常见的超过2个部分的域名,例如geek.co.il;3)禁止使用许多使用4个或更多字符的新TLD,例如mobiinfo;4)完全不支持IDN。 - Guss
显示剩余12条评论

39

4
不支持“+”寻址,例如“user+label@gmail.com”。 - Jolly Roger
2
这将对一些新域名失效。 - GP89
1
这也是无效的。请查看最高级域名列表http://www.iana.org/domains/root/db - Daniel

17

我已经使用这个函数有一段时间了,它返回一个布尔值。

// Validates email address of course.
function validEmail(e) {
    var filter = /^\s*[\w\-\+_]+(\.[\w\-\+_]+)*\@[\w\-\+_]+\.[\w\-\+_]+(\.[\w\-\+_]+)*\s*$/;
    return String(e).search (filter) != -1;
}

1
我知道这很老,但可以简化为:return String(e).match(/^\s*[\w-+]+(?:.[\w-+]+)*@[\w-+]+.[\w-+]+(?:.[\w-+_]+)\s$/); 如果没有匹配,则返回null;如果匹配成功,则返回电子邮件地址的单个项数组。 - Andir
我认为你的正则表达式不能验证例如nicolas.@gmail.com这样的电子邮件地址... 这符合RFC822标准吗?我不确定。有人可以验证一下吗? - nembleton
它将aaa-------@gmail.com标记为真。 - Imran Ahmad

13
有时候,大多数注册和登录页面需要验证电子邮件。在这个例子中,您将学习简单的电子邮件验证。 首先,在HTML中添加一个文本输入框和一个按钮,如下所示:
<input type='text' id='txtEmail'/>
<input type='submit' name='submit' onclick='checkEmail();'/>

<script>
    function checkEmail() {
        var email = document.getElementById('txtEmail');
        var filter = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
        if (!filter.test(email.value)) {
            alert('Please provide a valid email address');
            email.focus;
            return false;
        }
    }
</script>

您还可以使用这个正则表达式来检查

<input type='text' id='txtEmail'/>
<input type='submit' name='submit' onclick='checkEmail();'/>

<script>
    function checkEmail() {

        var email = document.getElementById('txtEmail');
        var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;

        if (!filter.test(email.value)) {
            alert('Please provide a valid email address');
            email.focus;
            return false;
        }
    }
</script>

检查此演示输出,您可以在此处检查

function checkEmail() {
        var email = document.getElementById('txtEmail');
        var filter = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
        if (!filter.test(email.value)) {
            alert('Please provide a valid email address');
            email.focus;
            return false;
        }
    }
<input type='text' id='txtEmail'/>
<input type='submit' name='submit' onclick='checkEmail();'/>

如果电子邮件无效,则会弹出警告消息,如果电子邮件有效,则不会出现警告消息。 有关正则表达式的更多信息,请参阅。

https://www.w3schools.com/jsref/jsref_obj_regexp.asp

希望它能对你有所帮助。

如果你在{2,4}后面加上一个+,那么{2,4}有什么意义呢? - brettwhiteman
那么它会显示无效的电子邮件,你能给我一个样本电子邮件地址吗? - Shafiqul Islam

11

你可能会对这个问题(或者这个问题)感兴趣,它强调了通过正则表达式识别有效电子邮件地址是一个非常难解决的问题(如果有可能的话)。


10

用更简单的

在这里:

var regexEmail = /\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;
var email = document.getElementById("txtEmail");

if (regexEmail.test(email.value)) {
    alert("It's Okay")
} else {
    alert("Not Okay")

}

祝你好运。


在编写此时,这个功能运行良好...希望它能保持这种状态,因为我经历过很多这样的情况 ;) - AO_

8
function isEmailAddress(str) {
   var pattern =/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
   return pattern.test(str);  // returns a boolean 
}

1
根据此,test@test.info 不是一个电子邮件。 - Dziad Borowy

5

电子邮件验证很容易出错。因此,我建议您使用Verimail.js

为什么?

  • 语法验证(根据RFC 822)。
  • IANA TLD验证
  • 最常见的TLD和电子邮件域名的拼写建议
  • 拒绝临时电子邮件帐户域,例如mailinator.com
  • jQuery插件支持

Verimail.js的另一个优点是,它具有对最常见的电子邮件域名和注册TLD的拼写建议。这可以大大降低用户对常见域名(如gmail.com,hotmail.com,aol.com等)拼写错误的反弹率。

例子:

  • test@gnail.com -> 您是指test@gmail.com吗?
  • test@hottmail.con -> 您是指test@hotmail.com吗?

如何使用它?

最简单的方法是下载并包含verimail.jquery.js到您的页面中。 然后,通过在需要验证的输入框上运行以下函数来连接Verimail:

$("input#email-address").verimail({
    messageElement: "p#status-message"
});

消息元素是一个可选元素,用于显示诸如“无效的电子邮件”或“你的意思是test@gmail.com吗?”之类的消息。如果您有一个表单,并且只想在电子邮件经过验证后继续使用,请使用下面所示的getVerimailStatus函数:

if($("input#email-address").getVerimailStatus() < 0){
    // Invalid email
}else{
    // Valid email
}

getVerimailStatus函数返回一个整数代码,根据对象Comfirm.AlphaMail.Verimail.Status。如上所示,如果状态是负整数值,则应将验证视为失败。但是,如果该值大于或等于0,则应将验证视为成功。


4

虽然来晚了,但我还是要说一句...

function isEmailValid(emailAdress) {
    var EMAIL_REGEXP = new RegExp('^[a-z0-9]+(\.[_a-z0-9]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,15})$', 'i');
    return EMAIL_REGEXP.test(emailAdress)
}

http://jsfiddle.net/yrshaikh/xvd6H/


"a@c om" 不是一个有效的电子邮件地址,但它通过了这个模式。 - Dziad Borowy
这个正则表达式没有经过彻底测试。 - Brandon
@Brandon 好的,然后呢? - Yasser Shaikh

4
你可以尝试使用这个表达式,我已经对许多电子邮件地址进行了测试。
var pattern = /^[A-Za-z0-9._%+-]+@([A-Za-z0-9-]+\.)+([A-Za-z0-9]{2,4}|museum)$/;

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