郵箱驗證看似簡單,實則暗藏 RFC 5322 標準的極致複雜性。本文提供從簡單實用到嚴格合規的多層級驗證方案,涵蓋 JavaScript 前端即時校驗、PHP 服務端二次驗證、正則表達式解析、常見陷阱與最佳實踐建議。
// 推薦: 簡潔、效能高、覆蓋常見格式
function isEmailSimple(email) {
// 支持: user@domain.com, user.name@sub.domain.com, user+tag@domain.cn
// 不支持: 引用字符串 "user name"@domain.com, IP 域名 user@[192.168.1.1], 註釋
const regex = /^[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])?)+$/;
return regex.test(email);
}
// 極簡版 (僅做基本格式檢查)
const isEmailBasic = (email) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
// 1. 內建過濾器 (推薦, PHP 5.2+)
function isEmailFilter($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
// 2. 正則驗證 (自定義規則)
function isEmailRegex($email) {
// 同 JS 簡單實用版正則
$pattern = '/^[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])?)+$/';
return (bool)preg_match($pattern, $email);
}
// 3. 組合策略: 先過濾器, 再正則 (可自定義禁止臨時郵箱等)
function validateEmail($email) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) return false;
// 可選: 禁止臨時郵箱域名
$disposable = ['10minutemail.com', 'guerrillamail.com', 'tempmail.com'];
$domain = strtolower(substr(strrchr($email, '@'), 1));
return !in_array($domain, $disposable);
}
完整 RFC 5322 正則極其龐大 (超過 6000 字符),包含引用字符串、域名字面量 (IP)、註釋、折行等極少用特性。生產環境不建議直接使用,維護成本極高且可能拒絕合法郵箱 (如包含 Unicode 的國際化郵箱)。
若必須嚴格合規,建議使用成熟庫:
egulias/email-validator (Symfony 組件底層依賴)composer require egulias/email-validatoremail-validator npm 包npm install email-validator正則只能驗證「語法格式」,無法驗證「郵箱真實存在」且「用戶擁有控制權」。
業務關鍵場景 (註冊、找回密綁、綁定通知) **必須**實施發送驗證碼/鏈接流程:
| 錯誤正則 | 問題 | 修正建議 |
|---|---|---|
不支持 . - + 等合法字符、不支持多級域名 | 使用層級一推薦正則 | |
/^.+@.+\..+$/ | 允許空格、特殊符號、多個 @ | 嚴格字符集定義 |
不加 ^$ 錨點 | aaa@bbb.ccc 會匹配 xxx aaa@bbb.ccc yyy | 必須加 ^ $ 或使用 test() / preg_match() 全匹配模式 |
| 不支援國際化域名 (IDN) | 拒絕 用戶@中文域名.中國 | 前端用 punycode.js 轉換為 ASCII (xn--...), 後端驗證 ASCII 格式 |
<input type="email"> 瀏覽器原生驗證 + JS 簡單正則即時提示。filter_var($email, FILTER_VALIDATE_EMAIL) + 業務層黑名單 (臨時郵箱、競品郵箱等)。email_verified_at。email VARCHAR(254) NOT NULL UNIQUE (RFC 5321 限制長度 254 字符)。郵箱驗證的核心不在正則有多複雜,而在於**「格式校驗 + 所有權驗證」雙重保障**。