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

PHP 常用正則表達式速查:手機、Email、URL、身分證等驗證大全

     編輯:PHP 相關知識

實戰級 PHP 正則驗證函數庫

表單驗證是 Web 開發核心需求。本文整理 8 個高頻驗證場景的正則模式,封裝為可直接復用的 PHP 函數,附詳細註解與測試範例。

驗證函數統一介面

function validate($pattern, $subject) {
    return (bool) preg_match($pattern, $subject);
}

1. 手機號碼(中國大陸三大運營商)

function isMobile($phone) {
    // 13x, 147, 15x(除154), 17x(除170/171), 18x, 19x + 8位數字
    $pattern = '/^1(?:3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[189])\d{8}$/';
    return validate($pattern, $phone);
}
// 測試
isMobile('13800138000'); // true
isMobile('12345678901'); // false

2. 電子郵件

function isEmail($email) {
    // RFC 5322 簡化版:local@domain.tld
    $pattern = '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/';
    return validate($pattern, $email);
}
// 建議搭配 filter_var($email, FILTER_VALIDATE_EMAIL) 雙重驗證

3. 座機電話(含區碼)

function isLandline($tel) {
    // (010) 12345678 | 010-12345678 | 010 12345678 | 021-87654321
    $pattern = '/^(?:(?:0\d{2,3}[- ]?)?\d{7,8})$/';
    return validate($pattern, $tel);
}

4. URL 網址

function isUrl($url) {
    // 協議可選,支援域名、IP、port、path、query、fragment
    $pattern = '/^(?:(?:https?|ftp):\/\/)?(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}(?::\d+)?(?:\/[^\s]*)?$/';
    return validate($pattern, $url);
}
// 複雜場景建議用 parse_url() + filter_var() 組合

5. 身分證字號(台灣格式)

function isTwId($id) {
    // 1個英文字母 + 9位數字,首碼對應縣市
    $pattern = '/^[A-Z][12]\d{8}$/';
    if (!validate($pattern, $id)) return false;
    // 加權驗證碼檢查(略)
    return true;
}

6. 郵遞區號(台灣 3+3 或 5 碼)

function isZipCode($zip) {
    // 3碼或 5碼(前3碼為鄉鎮市區)
    return validate('/^\d{3}(?:\d{2})?$/', $zip);
}

7. IPv4 位址

function isIpv4($ip) {
    $pattern = '/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$/';
    return validate($pattern, $ip);
}
// PHP 內建 filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) 更簡潔

8. 日期時間(YYYY-MM-DD HH:ii:ss)

function isDateTime($dt) {
    $pattern = '/^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])(?: [01]\d|2[0-3]:[0-5]\d:[0-5]\d)?$/';
    if (!validate($pattern, $dt)) return false;
    // 進一步用 strtotime 或 DateTime 驗證實際日期合法性
    return strtotime($dt) !== false;
}

9. 中文字符檢測(UTF-8)

function hasChinese($str) {
    return validate('/[\x{4e00}-\x{9fa5}]/u', $str);
}
// 提取所有中文
preg_match_all('/[\x{4e00}-\x{9fa5}]+/u', $str, $matches);

效能與安全建議

  1. 優先使用 PHP 內建 filter_var():Email、URL、IP、布林、整數、浮點數皆有對應過濾器
  2. 避免過度複雜正則:日期、身分證等含邏輯驗證的,正則只做格式檢查,核心邏輯用程式碼
  3. 使用定界符一致性:習慣用 /.../ 或 ~...~,避免模式中出現大量斜線
  4. 加上 'u' 修飾符:處理 UTF-8 字串(中文、Emoji)時必加,否則按位元組匹配會錯誤
  5. 快取編譯結果:同一模式重複使用時,preg_match 內部會快取,但跨請求不保留,高頻場景可考慮預編譯

常用修飾符速查

修飾符說明
i不區分大小寫
m多行模式(^$ 匹配行首尾)
s單行模式(. 匹配換行符)
uUTF-8 模式(必加)
x忽略模式空白,可寫註解
A強制從字串開頭匹配(等同 ^)
D$ 僅匹配字串結尾(不含換行)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved