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




regex email c# (24)

很難讓電子郵件驗證工具100%正確。 使其正確的唯一真正方法是向該帳戶發送測試電子郵件。 也就是說,有一些基本的檢查可以幫助確保你得到一些合理的東西。

有些事要改進:

而不是新的RegExp ,只需嘗試像這樣編寫正則regexp

if (reg.test(/@/))

其次,檢查以確保@標誌後面有一個句點,並確保@s和句點之間有字符。

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


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

email.indexOf("@") > 0

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

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


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

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


哇,這裡有很多複雜性。 如果您只想捕獲最明顯的語法錯誤,我會做這樣的事情:

\[email protected]\S+

它通常捕獲用戶做出的最明顯的錯誤,並確保表單大部分是正確的,這就是JavaScript驗證的全部內容。


只需使用HTML查看輸入的電子郵件地址是否有效。

<input type="email"/>

沒有必要編寫用於驗證的函數。


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})?$/

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


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

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

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

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

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


JavaScript可以匹配正則表達式:

emailAddress.match( / some_regex /);

這是電子郵件的RFC22正則表達式:

^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*
"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x
7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<
!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])
[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$

維基百科標準郵件語法:

https://en.wikipedia.org/wiki/Email_address#Examples https://fr.wikipedia.org/wiki/Adresse_%C3%A9lectronique#Syntaxe_exacte

function validMail(mail)
{
    return /^(([^<>()\[\]\.,;:\[email protected]\"]+(\.[^<>()\[\]\.,;:\[email protected]\"]+)*)|(\".+\"))@(([^<>()\.,;\[email protected]\"]+\.{0,1})+([^<>()\.,;:\[email protected]\"]{2,}|[\d\.]+))$/.test(mail);
}

// VALID MAILS

validMail('[email protected]') // Return true
validMail('[email protected]') // Return true
validMail('[email protected]') // Return true
validMail('[email protected]') // Return true
validMail('[email protected]') // Return true
validMail('user+mailbox/[email protected]') // Return true
validMail('"very.(),:;<>[]\".VERY.\"[email protected]\\ \"very\".unusual"@strange.example.com') // Return true
validMail('!#$%&\'*+-/=?^_`.{|}[email protected]') // Return true
validMail('"()<>[]:,;@\\\"!#$%&\'-/=?^_`{}| ~.a"@example.org') // Return true
validMail('"[email protected]"@example.com') // Return true
validMail('"Fred Bloggs"@example.com') // Return true
validMail('"Joe.\\Blow"@example.com') // Return true
validMail('Loïc.Accentué@voilà.fr') // Return true
validMail('" "@example.org') // Return true
validMail('[email protected][IPv6:2001:DB8::1]') // Return true

// INVALID MAILS

validMail('Abc.example.com') // Return false
validMail('[email protected]@[email protected]') // Return false
validMail('a"b(c)d,e:f;g<h>i[j\k][email protected]') // Return false
validMail('just"not"[email protected]') // Return false
validMail('this is"not\[email protected]') // Return false
validMail('this\ still\"not\\[email protected]') // Return false
validMail('[email protected]') // Return false
validMail('[email protected]') // Return false

顯示此測試:https://regex101.com/r/LHJ9gU/1https://regex101.com/r/LHJ9gU/1


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

這是正確的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);
}

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('[email protected]')){ console.log('This is email is valid'); }

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

<form><input type="email" placeholder="[email protected]">
    <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.!#$%&'*+/=?^_`{|}~-][email protected][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])?)*$/

我稍微修改了Jaymon對那些想要以下列形式進行簡單驗證的人的答案:

[email protected]

正則表達式:

/\[email protected]\S+\.\S+/

JavaScript函數示例:

function validateEmail(email) 
{
    var re = /\[email protected]\S+\.\S+/;
    return re.test(email);
}

這是node-validator工作方式:

/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~][email protected](?:(?:(?:[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])\]))$/

為了完整起見這裡有另一個符合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])?

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

[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

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

強調我的


使用單行正則表達式無法實現符合RFC的電子郵件地址的正確驗證。 我在PHP中找到的最佳解決方案的文章是什麼是有效的電子郵件地址? 。 顯然,它已被移植到Java。 我認為這個函數太複雜了,無法在JavaScript中移植和使用。 JavaScript / node.js端口: https://www.npmjs.com/package/email-addresses ://www.npmjs.com/package/email-addresses。

一個好的做法是在客戶端驗證您的數據,但要仔細檢查服務器上的驗證。 考慮到這一點,您只需檢查字符串是否在客戶端上看起來像一個有效的電子郵件地址,並對服務器執行嚴格檢查。

這是我用來檢查字符串是否看起來像有效郵件地址的JavaScript函數:

function looksLikeMail(str) {
    var lastAtPos = str.lastIndexOf('@');
    var lastDotPos = str.lastIndexOf('.');
    return (lastAtPos < lastDotPos && lastAtPos > 0 && str.indexOf('@@') == -1 && lastDotPos > 2 && (str.length - lastDotPos) > 2);
}

說明:

  • lastAtPos < lastDotPos :Last @應該在last之前. 因為@不能成為服務器名稱的一部分(據我所知)。

  • lastAtPos > 0 :在最後一個@之前應該有一些東西(電子郵件用戶名)。

  • str.indexOf('@@') == -1 :地址中不應該有@@ 。 即使@作為電子郵件用戶名中的最後一個字符出現,也必須引用它"將在@和地址中的最後一個@之間。

  • lastDotPos > 2 :最後一個點之前應該至少有三個字符,例如[email protected]

  • (str.length - lastDotPos) > 2 :在最後一個點之後應該有足夠的字符來形成一個雙字符域。 我不確定括號是否必要。


在現代瀏覽器中,您可以使用純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() : /\[email protected]\S+\.\S+/.test(value);
}

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


有史以來最好的正則表達式,用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])+


使用正則表達式可能是最好的方法。 你可以here看到一堆測試(取自chromium

function validateEmail(email) {
    var re = /^(([^<>()\[\]\\.,;:\[email protected]"]+(\.[^<>()\[\]\\.,;:\[email protected]"]+)*)|(".+"))@((\[[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,}))$/;
    return re.test(String(email).toLowerCase());
}

以下是接受unicode的常規表達示例:

var re = /^(([^<>()\[\]\.,;:\[email protected]\"]+(\.[^<>()\[\]\.,;:\[email protected]\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\[email protected]\"]+\.)+[^<>()[\]\.,;:\[email protected]\"]{2,})$/i;

但請記住,不應該只依賴JavaScript驗證。 可以輕鬆禁用JavaScript。 這也應該在服務器端驗證。

以下是上述操作的示例:

function validateEmail(email) {
  var re = /^(([^<>()[\]\\.,;:\[email protected]\"]+(\.[^<>()[\]\\.,;:\[email protected]\"]+)*)|(\".+\"))@((\[[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,}))$/;
  return re.test(email);
}

function validate() {
  var $result = $("#result");
  var email = $("#email").val();
  $result.text("");

  if (validateEmail(email)) {
    $result.text(email + " is valid :)");
    $result.css("color", "green");
  } else {
    $result.text(email + " is not valid :(");
    $result.css("color", "red");
  }
  return false;
}

$("#validate").bind("click", validate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form>
  <p>Enter an email address:</p>
  <input id='email'>
  <button type='submit' id='validate'>Validate!</button>
</form>

<h2 id='result'></h2>


這是從http://codesnippets.joyent.com/posts/show/1917偷來的

email = $('email');
filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (filter.test(email.value)) {
  // Yay! valid
  return true;
}
else
  {return false;}

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

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

你可以在here看到結果。


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

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

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

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

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


正則表達式更新2018年! 試試這個

let val = '[email protected]';
if(/^[a-z0-9][a-z0-9-_\.][email protected]([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val)) {
   console.log('passed');
}

typscript版本完成

//
export const emailValid = (val:string):boolean => /^[a-z0-9][a-z0-9-_\.][email protected]([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val);

更多信息https://git.io/vhEfc





email-validation