如何使用JQuery来验证电子邮件地址?


当前回答

我刚刚做了一个简化的,可以满足我的需要。 把它限制为字母数字,句号,下划线和@。

<input onKeyUp="testEmailChars(this);"><span id="a"></span>
function testEmailChars(el){
    var email = $(el).val();
    if ( /^[a-zA-Z0-9_@.-]+$/.test(email)==true ){
        $("#a").html("valid");
    } else {
        $("#a").html("not valid");
    }
}

在别人的帮助下完成

其他回答

我推荐Verimail.js,它也有一个JQuery插件。

为什么?Verimail支持以下功能:

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

所以除了验证,Verimail.js还会给你建议。因此,如果你输入了错误的顶级域名或域名,与普通的电子邮件域名(hotmail.com, gmail.com等)非常相似,它可以检测到这一点,并建议纠正。

例子:

test@gnail.con ->你是说test@gmail.com吗? test@hey.nwt ->你是说test@hey.net吗? test@hottmail.com ->你是说test@hotmail.com吗?

等等。

要使用jQuery,只需在你的网站上包含verimail.jquery.js,并运行下面的函数:

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

message元素是将在其中显示消息的元素。从“您的邮件无效”到“您的意思是……?”

如果你有一个表单,并且想要限制它,使它不能提交,除非电子邮件是有效的,那么你可以使用getVerimailStatus-function检查状态,如下所示:

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

该函数根据对象Comfirm.AlphaMail.Verimail.Status返回一个整数状态码。但一般的经验法则是,任何低于0的代码都是表示错误的代码。

<script type="text/javascript">
    $(document).ready(function() {
      $('.form_error').hide();
      $('#submit').click(function(){
           var name = $('#name').val();
           var email = $('#email').val();
           var phone = $('#phone').val();
           var message = $('#message').val();
           if(name== ''){
              $('#name').next().show();
              return false;
            }
            if(email== ''){
               $('#email').next().show();
               return false;
            }
            if(IsEmail(email)==false){
                $('#invalid_email').show();
                return false;
            }

            if(phone== ''){
                $('#phone').next().show();
                return false;
            }
            if(message== ''){
                $('#message').next().show();
                return false;
            }
            //ajax call php page
            $.post("send.php", $("#contactform").serialize(),  function(response) {
            $('#contactform').fadeOut('slow',function(){
                $('#success').html(response);
                $('#success').fadeIn('slow');
               });
             });
             return false;
          });
      });
      function IsEmail(email) {
        var regex = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
        if(!regex.test(email)) {
           return false;
        }else{
           return true;
        }
      }
  </script>

<form action="" method="post" id="contactform">
                            <table class="contact-table">
                              <tr>
                                <td><label for="name">Name :</label></td>
                                <td class="name"> <input name="name" id="name" type="text" placeholder="Please enter your name" class="contact-input"><span class="form_error">Please enter your name</span></td>
                              </tr>
                              <tr>
                                <td><label for="email">Email :</label></td>
                                <td class="email"><input name="email" id="email" type="text" placeholder="Please enter your email" class="contact-input"><span class="form_error">Please enter your email</span>
                                  <span class="form_error" id="invalid_email">This email is not valid</span></td>
                              </tr>
                              <tr>
                                <td><label for="phone">Phone :</label></td>
                                <td class="phone"><input name="phone" id="phone" type="text" placeholder="Please enter your phone" class="contact-input"><span class="form_error">Please enter your phone</span></td>
                              </tr>
                              <tr>
                                <td><label for="message">Message :</label></td>
                                <td class="message"><textarea name="message" id="message" class="contact-input"></textarea><span class="form_error">Please enter your message</span></td>
                              </tr>
                              <tr>
                                <td></td>
                                <td>
                                  <input type="submit" class="contactform-buttons" id="submit"value="Send" />
                                  <input type="reset" class="contactform-buttons" id="" value="Clear" />
                                </td>
                              </tr>
                            </table>
     </form>
     <div id="success" style="color:red;"></div>

我刚刚做了一个简化的,可以满足我的需要。 把它限制为字母数字,句号,下划线和@。

<input onKeyUp="testEmailChars(this);"><span id="a"></span>
function testEmailChars(el){
    var email = $(el).val();
    if ( /^[a-zA-Z0-9_@.-]+$/.test(email)==true ){
        $("#a").html("valid");
    } else {
        $("#a").html("not valid");
    }
}

在别人的帮助下完成

这个问题要比乍看之下更难回答。如果你想正确处理邮件。

世界上有很多人在寻找“统治一切的正则表达式”,但事实是,有大量的电子邮件提供商。

有什么问题吗?好吧,“a_z%@gmail.com不可能存在,但它可能通过其他提供商存在这样的地址”a__z@provider.com。

为什么? 根据RFC: https://en.wikipedia.org/wiki/Email_address RFC_specification。

为了方便讲解,我将摘录一段:

The local-part of the email address may use any of these ASCII characters: uppercase and lowercase Latin letters A to Z and a to z; digits 0 to 9; special characters !#$%&'*+-/=?^_`{|}~; dot ., provided that it is not the first or last character unless quoted, and provided also that it does not appear consecutively unless quoted (e.g. John..Doe@example.com is not allowed but "John..Doe"@example.com is allowed);[6] Note that some mail servers wildcard local parts, typically the characters following a plus and less often the characters following a minus, so fred+bah@domain and fred+foo@domain might end up in the same inbox as fred+@domain or even as fred@domain. This can be useful for tagging emails for sorting, see below, and for spam control. Braces { and } are also used in that fashion, although less often. space and "(),:;<>@[] characters are allowed with restrictions (they are only allowed inside a quoted string, as described in the paragraph below, and in addition, a backslash or double-quote must be preceded by a backslash); comments are allowed with parentheses at either end of the local-part; e.g. john.smith(comment)@example.com and (comment)john.smith@example.com are both equivalent to john.smith@example.com.

所以,我可以拥有一个这样的电子邮件地址:

A__z/J0hn.sm{it!}h_comment@example.com.co

如果你尝试这个地址,我打赌它会失败的所有或regex的主要部分张贴在整个网络。但是请记住这个地址遵循RFC规则,所以它是合理有效的。

想象一下我的沮丧,不能注册任何地方检查这些正则表达式!!

唯一真正能够验证电子邮件地址的人是电子邮件地址的提供者。

那么如何处理呢?

在几乎所有情况下,用户是否添加了无效的电子邮件都无关紧要。你可以依赖HTML 5输入type="email",这是运行接近RFC,几乎没有失败的机会。 HTML5输入类型="email"信息:https://www.w3.org/TR/2012/WD-html-markup-20121011/input.email.html

例如,这是RFC有效的电子邮件:

"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com

但是html5验证会告诉你@前面的文本不能包含"或()字符,这实际上是不正确的。

无论如何,您应该通过接受电子邮件地址并向该电子邮件地址发送电子邮件消息来实现这一点,并提供用户必须访问的代码/链接以确认有效性。

这样做的一个好做法是“再次输入您的电子邮件”,以避免用户输入错误。如果这对你来说还不够,添加一个预先提交的模式窗口,标题是“这是你当前的电子邮件吗?”,然后在用户输入的邮件中添加一个h2标签,你知道,以清楚地显示他们输入的电子邮件,然后是一个“是,提交”按钮。

function isValidEmail(emailText) {
    var pattern = new RegExp(/^((([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);
    return pattern.test(emailText);
};

像这样使用:

if( !isValidEmail(myEmail) ) { /* do things if myEmail is valid. */ }