javascript - validate - regex email c#




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

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


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

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

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

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

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


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

維基百科標準郵件語法:

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


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

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


做這個:

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

為什麼? 它基於RFC 2822 ,這是一個必須遵守的標準ALL電子郵件地址。

通常,當在數據庫中存儲電子郵件地址時,我將它們設置為小寫,並且在實踐中,正則表達式通常可以標記為不區分大小寫。 在這些情況下,這會略短:

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

以下是在JavaScript中使用它的示例(最後使用不區分大小寫的標記i )。

var emailCheck=/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
console.log( emailCheck.test('[email protected]') );

注意
從技術上講,一些電子郵件可以在@符號前面的部分中包含引號,並在引號內包含轉義字符(因此,您的電子郵件用戶可能是令人討厭的,並且包含@"..." ,只要它用引號括起來)。 沒有人這麼做! 它已經過時了。 但是,它包含在真正的RFC 2822標準中,並在此省略。

更多信息: http//www.regular-expressions.info/email.html


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

<input type="email"/>

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


在現代瀏覽器中,您可以使用純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的答案中的特徵檢測和簡單驗證,它可以讓您從常規表達式大屠殺中解脫出來,並且不會在舊瀏覽器上出現問題。


在驗證器函數中使用此代碼:

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
}

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

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

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

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

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


我發現這是最好的解決方案:

/^[^\[email protected]][email protected][^\[email protected]]+\.[^\[email protected]]+$/

它允許以下格式:

1.  [email protected]
2.  [email protected]
3.  [email protected]
4.  [email protected]
9.  #!$%&'*+-/=?^_`{}|[email protected]
6.  "()[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a"@example.org
7.  " "@example.org (space between the quotes)
8.  üñîçøðé@example.com (Unicode characters in local part)
9.  üñîçøðé@üñîçøðé.com (Unicode characters in domain part)
10. Pelé@example.com (Latin)
11. δοκιμή@παράδειγμα.δοκιμή (Greek)
12. 我買@屋企.香港 (Chinese)
13. 甲斐@黒川.日本 (Japanese)
14. чебурашка@ящик-с-апельсинами.рф (Cyrillic)

它顯然是多功能的,允許所有重要的國際角色,同時仍然執行基本的[email protected]格式。 它將阻止RFC在技術上允許的空間,但它們非常罕見,我很樂意這樣做。


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

[email protected]

正則表達式:

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

JavaScript函數示例:

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

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

email.indexOf("@") > 0

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

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


正則表達式更新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


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

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

強調我的


這是從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;}

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

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

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


使用正則表達式可能是最好的方法。 你可以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>


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

這是關於使用正則表達式驗證電子郵件地址的非常好的討論; “ 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




email-validation