在 PHP 開發中,驗證電子郵件地址格式是常見需求。雖然寫法多樣,但核心在於正則表達式的精準度與框架內建函數的活用。本文整理幾種主流驗證方式,並提供程式碼範例供參考。
最簡單的方式是使用 preg_match 搭配正則:
preg_match("/^([a-z0-9\\+_\\-]+)(\\.[a-z0-9\\+_\\-]+)*@([a-z0-9\\-]+\\.)+[a-z]{2,6}$/ix", $email)
此模式支援常見字元、子域名與 2-6 碼頂級域名,i 忽略大小寫,x 允許註解與空白。
CodeIgniter 採用類似正則,封裝為 valid_email():
function valid_email($str) {
return ( ! preg_match("/^([a-z0-9+_-]+)(\\.[a-z0-9+_-]+)*@([a-z0-9-]+\\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
}
PHPCMS 採用更簡潔的模式,並檢查長度:
function is_email($email) {
return strlen($email) > 6 && preg_match("/^[\\w-.]+@[\\w-.]+(\\.\\w+)+$/", $email);
}
WordPress 的 is_email() 並非單純正則,而是逐步檢查:
@ 且不在首位function is_email( $email, $deprecated = false ) {
if ( ! empty( $deprecated ) ) _deprecated_argument( __FUNCTION__, '3.0' );
if ( strlen( $email ) < 3 ) return apply_filters( 'is_email', false, $email, 'email_too_short' );
if ( strpos( $email, '@', 1 ) === false ) return apply_filters( 'is_email', false, $email, 'email_no_at' );
list( $local, $domain ) = explode( '@', $email, 2 );
if ( !preg_match( '/^[a-zA-Z0-9!#$%&\'*+/=?^_`{|}~.-]+$/', $local ) ) return apply_filters( 'is_email', false, $email, 'local_invalid_chars' );
if ( preg_match( '/\\.{2,}/', $domain ) ) return apply_filters( 'is_email', false, $email, 'domain_period_sequence' );
if ( trim( $domain, " \\t\\n\\r\\x0B." ) !== $domain ) return apply_filters( 'is_email', false, $email, 'domain_period_limits' );
$subs = explode( '.', $domain );
if ( 2 > count( $subs ) ) return apply_filters( 'is_email', false, $email, 'domain_no_periods' );
foreach ( $subs as $sub ) {
if ( trim( $sub, " \\t\\n\\r\\x0B-" ) !== $sub ) return apply_filters( 'is_email', false, $email, 'sub_hyphen_limits' );
if ( !preg_match('/^[a-z0-9-]+$/i', $sub ) ) return apply_filters( 'is_email', false, $email, 'sub_invalid_chars' );
}
return apply_filters( 'is_email', $email, $email, null );
}
針對特定需求可自行撰寫,例如支援 .cn 等雙後綴:
$email = "tanklo_--vehy@yahoo.com.cn";
function check_email($email) {
$pattern_test = "/([a-z0-9]*[-_.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[.][a-z]{2,3}([.][a-z]{2})?/i";
return preg_match($pattern_test, $email);
}
echo check_email($email); // 輸出 1 表示通過
filter_var($email, FILTER_VALIDATE_EMAIL)(PHP 5.2+ 內建)。