regex email js判斷 - 如何在JavaScript中驗證電子郵件地址?





15 Answers

為了完整起見這裡有另一個符合RFC 2822的正則表達式

官方標準稱為RFC 2822 。 它描述了有效電子郵件地址必須遵守的語法。 您可以( 但不應該 - 繼續閱讀 )使用此正則表達式實現它:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

(...)如果我們使用雙引號和方括號省略語法,我們會得到更實際的RFC 2822實現。 它仍將匹配當前實際使用的99.99%的電子郵件地址。

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

您可以進行的進一步更改是允許任何雙字母國家/地區代碼頂級域,並且只允許特定的通用頂級域。 此正則表達式過濾虛擬電子郵件地址,如asdf@adsf.adsf 。 您需要在添加新的頂級域時更新它

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[AZ]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b

因此,即使遵循官方標準,仍然需要進行權衡。 不要盲目地從在線圖書館或論壇中復制正則表達式。 始終使用您自己的數據和您自己的應用程序測試它們。

強調我的

email驗證 python regular

如何在JavaScript中驗證電子郵件地址?




你必須要了解第二個你決定使用正則表達式來驗證電子郵件的東西: 這可能不是一個好主意 。 一旦你接受了這個,那裡有很多實現可以讓你到達那裡, 本文很好地總結了它們。

簡而言之,唯一的方法是絕對,確定用戶輸入的內容實際上是電子郵件,實際上是發送電子郵件並查看會發生什麼。 除此之外,這一切都只是猜測。




HTML5本身有電子郵件驗證。 如果您的瀏覽器支持HTML5,那麼您可以使用以下代碼。

<form><input type="email" placeholder="me@example.com">
    <input type="submit">
</form>

jsFiddle鏈接

來自HTML5規範

有效的電子郵件地址是與以下ABNF的email生成相匹配的字符串,其字符集為Unicode。

email   = 1*( atext / "." ) "@" label *( "." label )
label   = let-dig [ [ ldh-str ] let-dig ]  ; limited to a length of 63 characters by RFC 1034 section 3.5
atext   = < as defined in RFC 5322 section 3.2.3 >
let-dig = < as defined in RFC 1034 section 3.5 >
ldh-str = < as defined in RFC 1034 section 3.5 >

此要求是對RFC 5322的故意違反 ,RFC 5322定義了同時過於嚴格(在“@”字符之前),過於模糊(在“@”字符之後)的電子郵件地址的語法,並且過於寬鬆(允許註釋) ,空白字符和大多數用戶不熟悉的引用字符串)在這裡具有實際用途。

以下JavaScript和Perl兼容的正則表達式是上述定義的實現。

/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[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])?)*$/



在現代瀏覽器中,您可以使用純JavaScript和DOM構建@Sushil的答案:

function validateEmail(value) {
  var input = document.createElement('input');

  input.type = 'email';
  input.required = true;
  input.value = value;

  return typeof input.checkValidity === 'function' ? input.checkValidity() : /\S+@\S+\.\S+/.test(value);
}

我在小提琴http://jsfiddle.net/boldewyn/2b6d5/放了一個例子。 結合Squirtle的答案中的特徵檢測和簡單驗證,它可以讓您從常規表達式大屠殺中解脫出來,並且不會在舊瀏覽器上出現問題。




這是正確的RFC822版本。

function checkEmail(emailAddress) {
  var sQtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
  var sDtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
  var sAtom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
  var sQuotedPair = '\\x5c[\\x00-\\x7f]';
  var sDomainLiteral = '\\x5b(' + sDtext + '|' + sQuotedPair + ')*\\x5d';
  var sQuotedString = '\\x22(' + sQtext + '|' + sQuotedPair + ')*\\x22';
  var sDomain_ref = sAtom;
  var sSubDomain = '(' + sDomain_ref + '|' + sDomainLiteral + ')';
  var sWord = '(' + sAtom + '|' + sQuotedString + ')';
  var sDomain = sSubDomain + '(\\x2e' + sSubDomain + ')*';
  var sLocalPart = sWord + '(\\x2e' + sWord + ')*';
  var sAddrSpec = sLocalPart + '\\x40' + sDomain; // complete RFC822 email address spec
  var sValidEmail = '^' + sAddrSpec + '$'; // as whole string

  var reValidEmail = new RegExp(sValidEmail);

  return reValidEmail.test(emailAddress);
}



所有電子郵件地址都包含“at”(即@)符號。 測試必要條件:

email.indexOf("@") > 0

不要打擾任何更複雜的事情。 即使您可以完美地確定電子郵件在RFC語法上是否有效,但這並不能告訴您它是否屬於提供它的人。 這才是真正重要的。

要測試它,請發送驗證消息。




我真的很期待解決這個問題。 所以我上面修改了電子郵件驗證正則表達

  • 原版的
    /^(([^<>()\[\]\\.,;:\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,}))$/

  • 改性
    /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()\.,;\s@\"]+\.{0,1})+[^<>()\.,;:\s@\"]{2,})$/

傳遞維基百科電子郵件地址中的示例。

你可以在here看到結果。




您不應該使用正則表達式來驗證輸入字符串以檢查它是否是電子郵件。 這太複雜了,不會涵蓋所有情況。

既然你只能覆蓋90%的案例,那就寫下:

function isPossiblyValidEmail(txt) {
   return txt.length > 5 && txt.indexOf('@')>0;
}

你可以改進它。 例如,'aaa @'是有效的。 但總的來說,你得到了要點。 並且不要忘記......一個簡單的90%解決方案比不起作用的100%解決方案更好。

世界需要更簡單的代碼......




這是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])\]))$/



不檢查TLD存在的解決方案是不完整的。

幾乎所有這些問題的答案都建議使用Regex來驗證電子郵件地址。我認為Regex只適用於初步驗證。似乎電子郵件地址的檢查驗證實際上是兩個獨立的問題:

1-驗證電子郵件格式:確保電子郵件符合RFC 5322中電子郵件的格式和模式以及TLD是否確實存在。可在here找到所有有效TLD的列表。

例如,雖然地址example@example.ccc將通過正則表達式,但它不是有效的電子郵件,因為ccc它不是IANA的頂級域名。

2-確保電子郵件確實存在:為此,唯一的選擇向用戶發送電子郵件




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'); }



有史以來最好的正則表達式,用RFC5322證實

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




這是關於使用正則表達式驗證電子郵件地址的非常好的討論; “ http://fightingforalostcause.net/misc/2006/compare-email-regex.php

以下是當前的頂級表達式,即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



<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>

<script language="JavaScript1.2">
    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)
    }
</script>

<script>
    function checkbae(){
        if (document.layers || document.getElementById || document.all)
            return checkemail()
        else
            return true
    }
</script>



Microsoft MVCASP.NET MVC中提供的正則表達式是

/^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/

我在這裡發布以防它有缺陷 - 儘管它總是滿足我的需求。






Related