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

PHP 郵箱地址正則驗證與用戶名/域名提取完整示例

     編輯:PHP 相關知識

PHP 實現郵箱格式驗證、用戶名域名分離的最佳實踐

郵箱驗證是 Web 表單高頻需求。本文提供基於 PCRE 的實用正則,演示如何驗證合法性並提取用戶名、域名部分,同時推薦使用 PHP 內建 filter_var 獲得更健壯的驗證。

一、核心正則與提取代碼

<?php
header('Content-Type: text/html; charset=UTF-8');

$reply = '';
if (isset($_POST['email_address'])) {
    $email = trim($_POST['email_address']);
    
    // 實用正則:本地部分允許字母數字._%+-,域名標準格式
    $pattern = '/^([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})$/i';
    
    if (preg_match($pattern, $email, $matches)) {
        $reply = "郵箱格式合法<br><br>\n";
        $reply .= "用戶名:{$matches[1]}<br>\n";
        $reply .= "域名:{$matches[2]}<br>\n";
    } else {
        $reply = "郵箱格式不合法";
    }
}
?>
<!DOCTYPE html>
<html>
<head><title>郵箱驗證演示</title></head>
<body>
  <h1>電子郵件地址驗證程序</h1>
  <form method="post">
    請輸入郵箱:<input name="email_address" type="text" size="40" /><br><br>
    <input type="submit" value="驗證" />
  </form>
  <?php echo $reply; ?>
</body>
</html>

二、正則詳細解析

片段含義
^字符串開始
([a-zA-Z0-9._%+-]+)捕獲組 1:用戶名,允許字母、數字、點、下劃線、百分號、加號、減號,至少一個
@字面 @ 符號
([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})捕獲組 2:域名,子域名允許字母數字點減號,頂級域至少 2 字母
$字符串結束
i大小寫不敏感修飾符

三、推薦:使用 filter_var (PHP 5.2+)

<?php
function is_valid_email($email) {
    // 基礎驗證
    if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
        return false;
    }
    // 可選:長度限制 (RFC 5321: 本地部分 ≤64,域名 ≤255,總長 ≤254)
    if (strlen($email) > 254) return false;
    // 可選:禁止連續雙點、首尾點等邊界情況
    if (preg_match('/\.\.|^\\.|\\.$|@\\./', $email)) return false;
    return true;
}

// 測試
var_dump(is_valid_email('test@example.com'));        // true
var_dump(is_valid_email('user.name+tag@sub.domain.cn')); // true
var_dump(is_valid_email('invalid@.com'));            // false
var_dump(is_valid_email('no-at-sign.com'));          // false
?>

四、國際化郵箱 (IDN) 支援

對於中文域名郵箱 (如 用戶@例子.中國),需先轉換為 ASCII (Punycode):

<?php
function validate_idn_email($email) {
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true; // 純 ASCII 通過
    
    // 嘗試分割並轉換域名部分
    if (preg_match('/^(.+)@(.+)$/u', $email, $m)) {
        $local = $m[1];
        $domain = $m[2];
        // 域名轉 Punycode
        $domainAscii = idn_to_ascii($domain, IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46);
        if ($domainAscii) {
            return filter_var($local . '@' . $domainAscii, FILTER_VALIDATE_EMAIL) !== false;
        }
    }
    return false;
}
?>

前提:安裝 intl 擴展 (pecl install intl 或 apt-get install php-intl)。

五、常見誤區與建議

  1. 不要寫超長正則:RFC 5322 完整正則超 6KB,維護成本極高,filter_var 覆蓋 99.9% 實際場景。
  2. 前端驗證不可信:HTML5 type="email" 規則較寬鬆,服務端必須二次驗證。
  3. 唯一性檢查:格式通過後,必須查數據庫唯一索引或發送驗證郵件確認所有權。
  4. 正則性能:避免災難性回溯,使用具體字符類而非 .*,關鍵位置加 + 而非 *。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved