電子郵件驗證是表單處理的基本功能,但網路上流傳的正則表達式往往無法涵蓋所有合法格式(如單字母域名 i@fufuok.com、雙字母頂級域 fufu@9.cn、多層域名 .com.cn 等)。本文整理多種驗證規則,並提供可直接使用的函式與類別封裝。
.net.cn、.com.cn)。-、_、.。-、_。preg_match("/^[0-9a-zA-Z]+@(([0-9a-zA-Z]+)[.])+[a-z]{2,4}$/i", $email);
說明:僅允許英數字開頭,域名至少兩層,頂級域 2-4 字母。無法通過單字母用戶名或域名測試。
$reg = '/^([a-zA-Z0-9]{1,20})(([_-.])?([a-zA-Z0-9]{1,20}))*@([a-zA-Z0-9]{1,20})(([-_])?([a-zA-Z0-9]{1,20}))*(.[a-z]{2,4}){1,2}$/';
特點:
{1,2})。function c_email($email) {
$reg = '/^([a-zA-Z0-9]{1,20})(([_-.])?([a-zA-Z0-9]{1,20}))*@([a-zA-Z0-9]{1,20})(([-_])?([a-zA-Z0-9]{1,20}))*(.[a-z]{2,4}){1,2}$/';
return (bool)preg_match($reg, $email);
}
// 使用範例
$email = 'mail@lizhong.me';
if (c_email($email)) {
echo '郵箱格式正確';
} else {
echo '郵箱格式錯誤';
}
class Reg {
public $mail;
function __construct() {
$this->mail = $_POST["mail"];
}
function RegMail() {
$pattern = "/^[0-9a-zA-Z]+(?:[_-][a-z0-9-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\.[a-zA-Z]+$/i";
if (preg_match($pattern, $this->mail)) {
echo "<script>alert('驗證成功')</script>";
} else {
echo "<script>alert('驗證失敗')</script>";
}
}
}
$r = new Reg();
$r->RegMail();
type="email" 或 JS 正則攔截明顯錯誤,後端再用 PHP 正則把關。| 測試信箱 | 預期 | 備註 |
|---|---|---|
| i@fufuok.com | 通過 | 單字母用戶名 |
| fufu@9.cn | 通過 | 單字母域名 |
| user.name@sub.domain.com.cn | 通過 | 多層域名、雙層頂級域 |
| user..name@domain.com | 失敗 | 連續點號不合法 |
| user@-domain.com | 失敗 | 域名不得以連字號開頭 |