表單驗證是 Web 開發核心需求。本文整理 8 個高頻驗證場景的正則模式,封裝為可直接復用的 PHP 函數,附詳細註解與測試範例。
function validate($pattern, $subject) {
return (bool) preg_match($pattern, $subject);
}
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
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) 雙重驗證
function isLandline($tel) {
// (010) 12345678 | 010-12345678 | 010 12345678 | 021-87654321
$pattern = '/^(?:(?:0\d{2,3}[- ]?)?\d{7,8})$/';
return validate($pattern, $tel);
}
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() 組合
function isTwId($id) {
// 1個英文字母 + 9位數字,首碼對應縣市
$pattern = '/^[A-Z][12]\d{8}$/';
if (!validate($pattern, $id)) return false;
// 加權驗證碼檢查(略)
return true;
}
function isZipCode($zip) {
// 3碼或 5碼(前3碼為鄉鎮市區)
return validate('/^\d{3}(?:\d{2})?$/', $zip);
}
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) 更簡潔
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;
}
function hasChinese($str) {
return validate('/[\x{4e00}-\x{9fa5}]/u', $str);
}
// 提取所有中文
preg_match_all('/[\x{4e00}-\x{9fa5}]+/u', $str, $matches);
/.../ 或 ~...~,避免模式中出現大量斜線preg_match 內部會快取,但跨請求不保留,高頻場景可考慮預編譯| 修飾符 | 說明 |
|---|---|
| i | 不區分大小寫 |
| m | 多行模式(^$ 匹配行首尾) |
| s | 單行模式(. 匹配換行符) |
| u | UTF-8 模式(必加) |
| x | 忽略模式空白,可寫註解 |
| A | 強制從字串開頭匹配(等同 ^) |
| D | $ 僅匹配字串結尾(不含換行) |