郵箱驗證是表單處理的基礎環節。本文整理 JavaScript 端三種不同嚴格度的正則,以及 PHP 端內建過濾器、自定義正則、斷言邊界等多種寫法,並說明各自優缺點與適用場景。
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);
}
function validateEmail(val) {
return /^[a-zA-Z0-9._]+[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,4}$/.test(val);
}
function checkEmail(mail) {
return /^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/.test(mail);
}
function isEmail($mail) {
return filter_var($mail, FILTER_VALIDATE_EMAIL);
}
$pattern = '/^([\w._]{2,10})@(\w{1,})\.([a-z]{2,4})$/';
if (preg_match($pattern, $email)) { /* 合法 */ }
// 必須加 ^ $ 確保整串匹配,否則 'abc@def.com.xxx' 也會通過
$strictPattern = '/^([\w._]{2,10})@(\w{1,})\.([a-z]{2,4})$/';
| 端別 | 方案 | 嚴格度 | 效能 | 維護性 | 建議場景 |
|---|---|---|---|---|---|
| JavaScript | RFC 5322 正則 | 極高 | 中 | 低(正則極長) | 核心註冊/登入、合規要求高 |
| 簡易正則 | 中 | 高 | 高 | 後台管理、內部工具、快速原型 | |
| IP/端口兼容版 | 中高 | 中 | 中 | 特殊業務(允許 IP 域名、端口) | |
| PHP | filter_var | 中高(官方維護) | 極高(C 實現) | 極高(零維護) | 所有後端驗證首選 |
| 自定義正則 | 可控 | 中 | 需自測 | 特殊業務限制(如僅允許特定域名) |
user+tag@example.com、user@sub.domain.tld、新頂級域(.app、.dev、.xyz 等)皆為合法。用戶@例子.中國)需使用 filter_var 或支援 IDN 的正則。