常見表單驗證需求:純中文、純英文、中英數混合、長度限制等。本文提供實用正則模式與 PHP 驗證函數,並說明編碼注意事項。
| 驗證需求 | 正則模式 (UTF-8) | 說明 |
|---|---|---|
| 純中文 (含標點) | `/^[\x{4e00}-\x{9fa5}]+$/u` | 基本漢字區塊 |
| 純中文 (無標點) | `/^[\x{4e00}-\x{9fa5}]+$/u` | 同上 |
| 中文+中文標點 | `/^[\x{4e00}-\x{9fa5}\x{3000}-\x{303f}\xff00-\xffef]+$/u` | 含全形標點 |
| 純英文字母 | `/^[a-zA-Z]+$/` | ASCII 字母 |
| 英文+數字 | `/^[a-zA-Z0-9]+$/` | 字母數字 |
| 中英數混合 | `/^[\x{4e00}-\x{9fa5}a-zA-Z0-9]+$/u` | 常用帳號/姓名 |
| 中英數+底線 | `/^[\x{4e00}-\x{9fa5}a-zA-Z0-9_]+$/u` | 使用者名稱 |
| 長度 2-20 字元 | `/^[\x{4e00}-\x{9fa5}a-zA-Z0-9]{2,20}$/u` | 加上長度限制 |
<?php
class Validator {
// 純中文 (UTF-8)
public static function isChinese($str, $allowPunct = false) {
$pattern = $allowPunct
? '/^[\x{4e00}-\x{9fa5}\x{3000}-\x{303f}\xff00-\xffef]+$/u'
: '/^[\x{4e00}-\x{9fa5}]+$/u';
return (bool)preg_match($pattern, $str);
}
// 純英文
public static function isEnglish($str) {
return (bool)preg_match('/^[a-zA-Z]+$/', $str);
}
// 英文+數字
public static function isAlnum($str) {
return (bool)preg_match('/^[a-zA-Z0-9]+$/', $str);
}
// 中英數混合
public static function isChineseAlnum($str, $allowUnderscore = false) {
$pattern = $allowUnderscore
? '/^[\x{4e00}-\x{9fa5}a-zA-Z0-9_]+$/u'
: '/^[\x{4e00}-\x{9fa5}a-zA-Z0-9]+$/u';
return (bool)preg_match($pattern, $str);
}
// 長度驗證 (支援多位元組)
public static function checkLength($str, $min, $max = null) {
$len = mb_strlen($str, 'UTF-8');
if ($len < $min) return false;
if ($max !== null && $len > $max) return false;
return true;
}
// 綜合驗證:姓名 (中文 2-10 字)
public static function validateChineseName($name) {
return self::isChinese($name) && self::checkLength($name, 2, 10);
}
// 綜合驗證:使用者名稱 (中英數底線 4-20 字)
public static function validateUsername($username) {
return self::isChineseAlnum($username, true) && self::checkLength($username, 4, 20);
}
}
// 使用範例
var_dump(Validator::isChinese('測試中文')); // true
var_dump(Validator::isChinese('Test123')); // false
var_dump(Validator::validateChineseName('張三')); // true
var_dump(Validator::validateUsername('user_123')); // true
var_dump(Validator::validateUsername('ab')); // false (太短)
?>
原始碼使用 `ereg` (已棄用/移除)、`x81-xfe` 等 GB2312 位元組範圍,**不適用於 UTF-8 環境**。現代 PHP 必須使用 `preg_match` + `u` 修飾符 + Unicode 碼點範圍。
| 區塊 | 範圍 | 說明 |
|---|---|---|
| CJK 統一表意文字 | U+4E00-U+9FA5 | 常用漢字 20,902 字 |
| CJK 統一表意文字擴展 A | U+3400-U+4DBF | 罕用字 |
| CJK 符號和標點 | U+3000-U+303F | 全形標點、空白 |
| 半形及全形形式 | U+FF00-U+FFEF | 全形英數字、符號 |
| CJK 統一表意文字擴展 B | U+20000-U+2A6DF | 極罕用字 (需 PHP 7.1+ 支援) |
// 台灣身分證字號
function validateTWID($id) {
if (!preg_match('/^[A-Z][12]\d{8}$/', $id)) return false;
$letters = 'ABCDEFGHJKLMNPQRSTUVXYWZIO';
$nums = [10,11,12,13,14,15,16,17,34,18,19,20,21,22,35,23,24,25,26,27,28,29,32,30,31,33];
$c = strtoupper($id[0]);
$n = $nums[strpos($letters, $c)];
$sum = (int)($n/10) + ($n%10)*9;
for ($i=1; $i<=8; $i++) $sum += $id[$i] * (9-$i);
$sum += $id[9];
return $sum % 10 === 0;
}
// 手機號碼 (台灣)
function validateTWMobile($mobile) {
return (bool)preg_match('/^09\d{8}$/', $mobile);
}
?>