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

PHP 郵箱驗證正則表達式完整指南:從基礎到進階

     編輯:PHP 相關知識

前言

電子郵件驗證是表單處理的基本功能,但網路上流傳的正則表達式往往無法涵蓋所有合法格式(如單字母域名 i@fufuok.com、雙字母頂級域 fufu@9.cn、多層域名 .com.cn 等)。本文整理多種驗證規則,並提供可直接使用的函式與類別封裝。

核心驗證需求

  1. 不限制總長度(可自行加上)。
  2. 支援多層域名後綴(如 .net.cn、.com.cn)。
  3. 郵箱名(@ 前)以英數開頭,中間可含 -、_、.。
  4. 域名部份以英數開頭,中間可含 -、_。

基礎正則(簡易版)

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-20 字英數,可重複「特殊符號 + 1-20 字英數」。
  • 域名部份:同樣邏輯,支援雙層頂級域({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();

常見誤區與建議

  • 不要過度嚴格:RFC 5322 允許的字元極多(含引號、註解等),實務上以「能收到信」為準。
  • 前後端雙重驗證:前端用 HTML5 type="email" 或 JS 正則攔截明顯錯誤,後端再用 PHP 正則把關。
  • 最終仍需發送驗證信:正則只能檢查格式,無法確認信箱真實存在。

單元測試建議案例

測試信箱預期備註
i@fufuok.com通過單字母用戶名
fufu@9.cn通過單字母域名
user.name@sub.domain.com.cn通過多層域名、雙層頂級域
user..name@domain.com失敗連續點號不合法
user@-domain.com失敗域名不得以連字號開頭
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved