處理多語言系統時,常需驗證輸入是否僅包含中文、英數、底線。由於 UTF-8 與 GBK 編碼的中文位元組範圍不同,正則模式必須對應編碼撰寫。
<?php
$str = '測試字串_123';
// 方法一:Unicode 碼點範圍(需 u 修飾符)
if (preg_match('/^[\x{4e00}-\x{9fa5}a-zA-Z0-9_]+$/u', $str)) {
echo "UTF-8 格式合法";
}
// 方法二:Unicode 屬性 \p{Han} 代表漢字(PHP 5.1+)
if (preg_match('/^[\p{Han}a-zA-Z0-9_]+$/u', $str)) {
echo "UTF-8 格式合法(更簡潔)";
}
?>
<?php
$str_gbk = iconv('UTF-8', 'GBK', '測試字串_123');
// GBK 中文範圍:A1-FE 兩位元組
if (preg_match('/^[\x81-\xFE\x40-\x7E\x80-\xFEa-zA-Z0-9_]+$/', $str_gbk)) {
echo "GBK 格式合法";
}
// 簡化版(僅針對常用漢字區)
if (preg_match('/^[\xA1-\xFFa-zA-Z0-9_]+$/', $str_gbk)) {
echo "GBK 簡易檢查通過";
}
?>
<?php
function validateInput(string $input): bool
{
// 偵測編碼
$encoding = mb_detect_encoding($input, ['UTF-8', 'GBK', 'GB2312'], true);
if ($encoding === 'UTF-8') {
return (bool)preg_match('/^[\p{Han}a-zA-Z0-9_]+$/u', $input);
} elseif (in_array($encoding, ['GBK', 'GB2312'])) {
return (bool)preg_match('/^[\xA1-\xFFa-zA-Z0-9_]+$/', $input);
}
return false; // 未知編碼拒絕
}
// 測試
$tests = ['測試_123', 'test_abc', '測試@#$'];
foreach ($tests as $t) {
echo "$t => " . (validateInput($t) ? '合法' : '非法') . "\n";
}
?>
mb_detect_encoding 偵測並非 100% 準確,短字串易誤判;生產環境應強制規範輸入編碼。filter_var 搭配 FILTER_VALIDATE_REGEXP 或表單驗證庫(如 Symfony Validator)。