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


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

因此,即使遵循官方標準,仍然有待取捨。 不要盲目複製在線圖書館或論壇的正則表達式。 始終在您自己的數據和您自己的應用程序上測試它們。

強調我的

Question

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




有一件事你必須明白,第二你決定使用正則表達式來驗證電子郵件: 這可能不是一個好主意 。 一旦你了解了這一點,那裡有很多實現可以讓你在一半的地方, 這篇文章很好地總結了它們。

總之,唯一的方法是絕對肯定用戶輸入的內容實際上是一封電子郵件,實際上是發送一封電子郵件,看看會發生什麼。 除此之外,這全是猜測。




Use this code inside your validator function:

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

Else you can use jQuery . Inside rules define:

eMailId: {
    required: true,
    email: true
}



做這個:

[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 ,它是所有電子郵件地址必須遵守的標準。

通常,在數據庫中存儲電子郵件地址時,我將它們設置為小寫字母,實際上,正則表達式通常可以標記為不區分大小寫。 在這種情況下,這個比較短一些:

[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('some.body@domain.co.uk') );

注意
從技術上講,某些電子郵件可以在引號內的轉義字符之前的部分包含引號(因此,只要用引號引起來,您的電子郵件用戶可能會討厭並包含像@"..."之類的內容)。 NOBODY能做到這一點! 已經過時了。 但它包含在真正的RFC 2822標準中,並在此處省略。

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




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



best regex ever which confirm 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])+




Sectrean's solution works great, but it was failing my linter . So I added some escapes:

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



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

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

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

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

我在小提琴http://jsfiddle.net/boldewyn/2b6d5/放了一個例子。 結合功能檢測和Squirtle的答案中的裸機驗證,它將您從正則表達式大屠殺中解脫出來,而不會在舊版瀏覽器中生存。




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

有些事情要改善:

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

if (reg.test(/@/))

Second, check to make sure that a period comes after the @ sign, and make sure that there are characters between the @ s and periods.




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

email.indexOf("@") > 0

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

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




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,它定義了一個同時過於嚴格(在“@”字符之前),過於含糊(在“@”字符之後)和太寬鬆(允許評論)的電子郵件地址的語法,空白字符和大多數用戶不熟悉的引用字符串)在這裡有實際用處。

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



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

  • 原版的
    /^(([^<>()\[\]\\.,;:\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看到結果。




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



My knowledge of regular expressions is not that good. That's why I check the general syntax with a simple regular expression first and check more specific options with other functions afterwards. This may not be not the best technical solution, but this way I'm way more flexible and faster.

The most common errors I've come across are spaces (especially at the beginning and end) and occasionally a double dot.

function check_email(val){
    if(!val.match(/\S+@\S+\.\S+/)){ // Jaymon's / Squirtle's solution
        // Do something
        return false;
    }
    if( val.indexOf(' ')!=-1 || val.indexOf('..')!=-1){
        // Do something
        return false;
    }
    return true;
}

check_email('check@thiscom'); // Returns false
check_email('check@this..com'); // Returns false
check_email(' check@this.com'); // Returns false
check_email('check@this.com'); // Returns true



維基百科標準郵件語法:

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

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

// VALID MAILS

validMail('Abc@example.com') // Return true
validMail('Abc@example.com.') // Return true
validMail('Abc@10.42.0.1') // Return true
validMail('user@localserver') // Return true
validMail('Abc.123@example.com') // Return true
validMail('user+mailbox/department=shipping@example.com') // Return true
validMail('"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com') // Return true
validMail('!#$%&\'*+-/=?^_`.{|}~@example.com') // Return true
validMail('"()<>[]:,;@\\\"!#$%&\'-/=?^_`{}| ~.a"@example.org') // Return true
validMail('"Abc@def"@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('user@[IPv6:2001:DB8::1]') // Return true

// INVALID MAILS

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

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






Links