網站搜尋

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


我想在將使用者輸入發送到伺服器或嘗試向其發送電子郵件之前,先在 JavaScript 中檢查該輸入是否為電子郵件地址,以防止最基本的輸入錯誤。我該如何實現這一點?

答案#1

在 JavaScript 中,使用正則表達式可能是驗證電子郵件地址的最佳方式。查看從 Chromium 取出的在 JSFiddle 上的一系列測試。

const validateEmail = (email) => {
  return String(email)
    .toLowerCase()
    .match(
      /^(([^<>()[\]\\.,;:\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,}))$/
    );
};

以下是一個接受 Unicode 的正則表達式範例。

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

請記住,不應僅依賴 JavaScript 驗證,因為客戶端可以輕易地禁用 JavaScript。此外,對伺服器端的驗證也很重要。

以下程式碼片段是一個在客戶端驗證電子郵件地址的 JavaScript 範例。

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

const validate = () => {
  const $result = $('#result');
  const email = $('#email').val();
  $result.text('');

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

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

<label for="email">Enter email address</label>
<input id="email" type="email">

<p id="result"></p>

答案#2

我稍微修改了 Jaymon 的回答,給那些希望非常簡單驗證的人,格式如下:

[email 

正規表達式:

/^\S+@\S+\.\S+$/

為了防止匹配多個 @ 符號:

/^[^\s@]+@[^\s@]+\.[^\s@]+$/

上述正則表達式會匹配整個字串,如果你想匹配字串中的任意位置,請移除前面的 ^ 和結尾的 $。下面的範例會匹配字串中的 任意位置。

如果你確實想匹配整個字串,你可能想先對字串使用 trim()。

範例 JavaScript 函式:

function validateEmail(email) {
  var re = /\S+@\S+\.\S+/;
  return re.test(email);
}
    
console.log(validateEmail('my email is [email ')); // true
    
console.log(validateEmail('my email is anystring@anystring .any')); // false

答案#3

僅為完整性,這裡給你另一個符合 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  這樣的虛擬電子郵件地址。你 將需要在新增頂級域名時更新它。

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

所以即使遵循官方標準,仍然需要做出取捨。不要盲目地從線上庫或討論論壇複製正則表達式。一定要在自己的資料和應用上進行測試。

重點為我標示

答案#4

哇,這裡有很多複雜的地方。如果你只是想抓住最明顯的語法錯誤,我會這樣做:

^\S+@\S+$

它通常會抓住使用者最明顯的錯誤,並確保表單大體上是正確的,這就是 JavaScript 驗證的全部目的。

編輯:我們也可以使用來檢查電子郵件中的 '.'

/^\S+@\S+\.\S+$/

答案#5

當你決定使用正則表達式來驗證電子郵件時,你必須立刻理解一件事:這可能不是一個好主意。一旦你接受了這一點,市面上有許多實現方法可以幫你做到一半,這篇文章很好地總結了它們。

簡言之,唯一能完全確定使用者輸入的確實是電子郵件的方法,就是實際發送一封電子郵件並觀察結果。除此之外,都只是猜測而已。

答案#6

HTML5 本身具有電子郵件驗證功能。如果你的瀏覽器支持 HTML5,那麼你可以使用以下程式碼。

<form>
  <label>Email Address
    <input type="email" placeholder="[email " required>
  </label>
  <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])?)*$/

答案#7

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

/^[^\s@]+@[^\s@]+\.[^\s@]+$/

它允許以下格式:

1.  [email 
2.  [email 
3.  [email 
4.  [email 
9.  #!$%&'*+-/=?^_`{}|[email 
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 格式。它會阻止技術上 RFC 允許的空格,但由於空格非常罕見,我對此感到滿意。

答案#8

在現代瀏覽器中,你可以在 @Sushil 的答案基礎上,使用純 JavaScript 和 DOM 進行構建:

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

我已經在 fiddle 中整理了一個範例 http://jsfiddle.net/boldewyn/2b6d5/。結合特徵檢測以及 Squirtle 答案中的基本驗證,它可以讓你擺脫正則表達式的災難,而且在舊瀏覽器上也不會出錯。

答案#9

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

答案#10

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

email.includes('@')

或者,如果你需要支持 IE/較舊的瀏覽器:

email.indexOf('@') > 0

別費心用更複雜的方法。即使你能完美判斷一封電子郵件是否符合 RFC 語法,那也無法告訴你它是否屬於提供它的人。這才是最重要的。

要測試這個,請發送驗證訊息。

答案#11

正確驗證電子郵件地址以符合 RFC 標準不是可以用一行正則表達式就能實現的事情。我找到的在 PHP 中的最佳解決方案文章是 什麼是有效的電子郵件地址?。顯然,它已經被移植到 Java。我認為這個函數太複雜,無法移植並在 JavaScript 中使用。 JavaScript/node.js 移植版:https://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:最後的 @ 應該在最後的 . 之前,因為 @ 不能是伺服器名稱的一部分(據我所知)。

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

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

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

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

答案#12

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

答案#13

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

答案#14

做這個:

^([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

在 https://regex101.com/r/857lzc/1 測試它

在資料庫中儲存電子郵件地址時,我經常會將它們轉為小寫,而且在實際操作中,正則表達式通常可以設為不區分大小寫。在這些情況下,這樣做會稍微簡短一些:

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

注意:
技術上,一些電子郵件可以在 @ 符號之前的部分包含引號,且在引號內使用跳脫字符(因此你的電子郵件用戶名可能很惡劣,包含像 @ 和 "..." 這樣的內容,只要它被寫在引號中)。沒有人會這麼做!這已經過時了。但,它確實包含在真正的 RFC 2822 標準中,而此處省略了。

注意 2:電子郵件的開頭(@符號之前)可能區分大小寫(根據規範)。然而,任何使用區分大小寫電子郵件的人可能已經習慣遇到問題,實際上,一般假設不區分大小寫是安全的。更多信息:電子郵件地址是否區分大小寫?

更多資訊: http://www.regular-expressions.info/email.html

答案#15

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

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

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

你可以在這裡看到結果。

答案 #16

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

<input type="email"/>

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

答案#17

你不應該使用正則表達式來驗證輸入字串是否為電子郵件。這太複雜,並且無法涵蓋所有情況。

既然你只能涵蓋90%的情況,寫些類似這樣的東西:

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

你可以對它進行優化。例如,'aaa@' 是有效的。但總的來說,你明白大意。不要太過分……一個簡單的 90% 解決方案比不起作用的 100% 解決方案更好。

世界需要更簡單的程式碼...

答案#18

維基百科標準郵件語法 :

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

有效的電子郵件:

validMail('[email ') // Return true
validMail('[email .') // Return true
validMail('[email ') // Return true
validMail('user@localserver') // Return true
validMail('[email ') // Return true
validMail('user+mailbox/[email ') // Return true
validMail('"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com') // Return true
validMail('!#$%&\'*+-/=?^_`.{|}[email ') // 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

無效的電子郵件:

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

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

答案#19

正則表達式已更新!試試這個

let val = '[email ';
if(/^[a-z0-9][a-z0-9-_\.]+@([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');
}

typescript 版本完成

//
export const emailValid = (val:string):boolean => /^[a-z0-9][a-z0-9-_\.]+@([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

答案#20

要使電子郵件驗證器達到百分之百的正確是很困難的。唯一真正能確保正確的方法是向該帳戶發送測試郵件。話雖如此,有一些基本檢查可以幫助確保你得到的是合理的結果。

需要改進的地方:

與其使用新的 RegExp,不如像這樣直接寫出 regexp:

if (reg.test(/@/))

其次,檢查確保 @ 符號後面有句點,並確保 @ 和句點之間有字符。

答案#21

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

答案#22

一個不檢查頂級域名存在性的解決方案是不完整的。

幾乎所有對這個問題的回答都建議使用正則表達式來驗證電子郵件地址。我認為正則表達式只適合做基本驗證。看起來,電子郵件地址的驗證實際上是兩個獨立的問題:

1- 電子郵件格式驗證:確認電子郵件是否符合 RFC 5322 中的電子郵件格式和模式,以及頂級域(TLD)是否實際存在。所有有效的頂級域列表可以在這裡找到。

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

2- 確認電子郵件實際存在:為了做到這一點,唯一的選擇是向用戶發送電子郵件。

答案#23

在您的驗證器函數內使用此代碼:

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
}

答案#24

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

答案#25

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

function checkbae() {
  if (document.layers || document.getElementById || document.all)
    return checkemail()
  else
    return true
}
<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>

答案#26

我對正則表達式的知識不是很好。這就是為什麼我會先用一個簡單的正則表達式檢查一般語法,然後再用其他函數檢查更具體的選項。這可能不是最好的技術解決方案,但這樣我會更靈活、更快速。

我遇到的最常見錯誤是空格(尤其是在開頭和結尾)以及偶爾出現的雙點。

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('[email '); // Returns false
check_email(' [email '); // Returns false
check_email('[email '); // Returns true

答案#27

這裡有一個關於使用正則表達式驗證電子郵件地址的非常好的討論;《比較電子郵件地址驗證正則表達式》

這裡是目前頂尖的表達方式,與 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

答案#28

用於驗證電子郵件地址的正則表達式

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

答案#29

顯然,就是這樣:

/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i

摘自 http://fightingforalostcause.net/misc/2006/compare-email-regex.php,日期為 2010 年 10 月 1 日。

但是,當然,這忽略了國際化。

答案#30

哇,有很多答案包含稍微不同的正則表達式。我試過很多,結果都不同,而且每個都有各種不同的問題。

對於使用者介面驗證,我對最基本的檢查,即尋找 @ 符號,是可以接受的。值得注意的是,我總是進行伺服器端驗證,使用一個標準的「驗證電子郵件」方法,其中包含一個唯一的連結,讓使用者確認他們的電子郵件地址。

if (email.indexOf('@') > 0)

我故意選擇了 0,即使是從零開始計數,因為這也確保了 @ 前面有一個單一字符。