一個合法郵箱 = 本地部分 + @ + 域名部分
!#$%&'*+/=?^_`{|}~-、點 .(不可首尾、不可連續)完全符合 RFC 5322 的正則極其複雜(上千字符),實際項目通常採用實用主義子集。
/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
test@hotmail.com, te-st@qq.com.cn, te_st@sima.vip.comte.._st@sima.vip.com(連續點)會通過/^([0-9A-Za-z\-_\.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)$/g
-、_、.,至少一個字符[0-9a-z]+ + . + 頂級域 [a-z]{2,3}(如 com/net/org)+ 可選二級域 .[a-z]{2}(如 cn/jp)<input type="email" name="email" required>
user@localhost)function validateEmail(email) {
// 推薦:進階版正則
const regex = /^([0-9A-Za-z\-_\.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)$/i;
return regex.test(email);
}
// 測試用例
const testCases = [
'test@hotmail.com', // true
'test@sima.vip.com', // true
'te-st@qq.com.cn', // true
'te_st@sima.vip.com', // true
'te.._st@sima.vip.com', // false (連續點)
'user@localhost', // false (無頂級域)
'user@.com', // false (域名為空)
'@domain.com', // false (本地部分為空)
'user@domain.c', // false (頂級域過短)
'user@domain.commmm', // false (頂級域過長)
];
testCases.forEach(email => console.log(email, validateEmail(email)));
| 層級 | 手段 | 目的 |
|---|---|---|
| 前端 UI | <input type="email"> + 正則即時提示 | 用戶體驗,攔截 90% 格式錯誤 |
| 前端提交前 | JS 正則二次校驗 | 防繞過 UI,減少無效請求 |
| 後端接口 | 正則 + javax.validation @Email + 發送驗證碼 | 安全底線,驗證郵箱真實存在性 |
punycode 轉碼(如 用戶@例子.中國 → user@xn--fsq.xn--fiqs8s)。/i 標誌。採用「前端寬鬆攔截 + 後端嚴格校驗 + 驗證碼確權」三層防線,兼顧體驗與安全。