<?php
function isValidEmail($email) {
$qtext = '[^\x0d\x22\x5c\x80-\xff]';
$dtext = '[^\x0d\x5b-\x5d\x80-\xff]';
$atom = '[^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+';
$quotedPair = '\x5c[\x00-\x7f]';
$domainLiteral = "\x5b($dtext|$quotedPair)*\x5d";
$quotedString = "\x22($qtext|$quotedPair)*\x22";
$domainRef = $atom;
$subDomain = "($domainRef|$domainLiteral)";
$word = "($atom|$quotedString)";
$domain = "$subDomain(\x2e$subDomain)*";
$localPart = "$word(\x2e$word)*";
$addrSpec = "$localPart\x40$domain";
return (bool)preg_match("!^$addrSpec$!", $email);
}
// 測試
var_dump(isValidEmail('user@example.com')); // true
var_dump(isValidEmail('"quoted@local"@domain.com')); // true
var_dump(isValidEmail('invalid')); // false
?>
PHP 5.2+ 內置 filter_var() 更簡潔、維護性更強:
$email = 'test@example.com';
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo '格式合法';
} else {
echo '格式非法';
}
| 方案 | 優點 | 缺點 |
|---|---|---|
| 自定義正則 | 可精確控制規則、無依賴 | 極難覆蓋所有 RFC 邊界情況、維護困難 |
| filter_var | 官方維護、性能好、代碼簡潔 | PHP 版本差異、不支持部分極罕見合法地址 |
| 第三方庫 (eg. egulias/email-validator) | 完全 RFC 兼容、支持 DNS/MX 驗證 | 引入依賴、體積較大 |
filter_var($email, FILTER_VALIDATE_EMAIL)。egulias/email-validator。.