首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 電子郵件地址驗證完整指南:正則、框架與最佳實踐

     編輯:PHP 相關知識

PHP 中驗證 Email 地址的多種方法

在 PHP 開發中,驗證電子郵件地址格式是常見需求。雖然寫法多樣,但核心在於正則表達式的精準度與框架內建函數的活用。本文整理幾種主流驗證方式,並提供程式碼範例供參考。

1. 基礎正則表達式驗證

最簡單的方式是使用 preg_match 搭配正則:

preg_match("/^([a-z0-9\\+_\\-]+)(\\.[a-z0-9\\+_\\-]+)*@([a-z0-9\\-]+\\.)+[a-z]{2,6}$/ix", $email)

此模式支援常見字元、子域名與 2-6 碼頂級域名,i 忽略大小寫,x 允許註解與空白。

2. CodeIgniter 框架驗證函數

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;
}

3. PHPCMS 輕量級驗證

PHPCMS 採用更簡潔的模式,並檢查長度:

function is_email($email) {
    return strlen($email) > 6 && preg_match("/^[\\w-.]+@[\\w-.]+(\\.\\w+)+$/", $email);
}

4. WordPress 完整驗證邏輯

WordPress 的 is_email() 並非單純正則,而是逐步檢查:

  • 最小長度(3 字元)
  • 必須包含 @ 且不在首位
  • 分割本地部份與域名部份
  • 本地部份允許特殊字元(!#$%&'*+/=?^_`{|}~.-)
  • 域名不得有連續點、首尾空白或連字號
  • 域名至少兩段,每段只能含字母、數字、連字號
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 );
}

5. 自訂簡易驗證函數

針對特定需求可自行撰寫,例如支援 .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+ 內建)。
  • 框架開發:優先使用框架提供的驗證類別(如 Laravel Validator、CodeIgniter)。
  • 嚴格業務:參考 WordPress 邏輯,自行擴充國際化域名(IDN)支援。
  • 效能考量:避免過度複雜的正則,必要時快取編譯結果。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved