在 PHP 開發中處理中文字符匹配看似簡單,但不同編碼(GBK、UTF-8)下的正則寫法卻大相逕庭。本文將系統梳理兩種主流編碼環境下的中文匹配方案,並提供可直接落地的代碼示例。
GBK 編碼中,漢字佔用兩個字節,第一字節範圍 \x81-\xFE,第二字節範圍 \x40-\xFE(排除 \x7F)。基於此特性,我們可以構造對應正則。
<?php
$str = '全部是漢字測試';
if (preg_match_all("/^([\x81-\xFE][\x40-\xFE])+$/", $str, $match)) {
echo '全部是漢字';
} else {
echo '不全是漢字';
}
?>
測試結果:
$str = '全部是漢字測試' → 輸出「全部是漢字」$str = 'all全部是漢字測試' → 輸出「不全是漢字」<?php
$str = '漢字3測試';
if (preg_match("/([\x81-\xFE][\x40-\xFE])/", $str, $match)) {
echo '含有漢字';
} else {
echo '不含有漢字';
}
?>
測試結果:
$str = '漢字3測試' → 輸出「含有漢字」$str = 'abc345' → 輸出「不含有漢字」注意:上述變量 $str 的編碼格式(UTF-8 或 GBK)不影響判斷結果,關鍵在於正則模式與字符串實際編碼一致。
UTF-8 下漢字對應 Unicode 範圍 U+4E00–U+9FA5(基本 CJK 統一表意文字)。PHP 需配合 u 修飾符啟用 Unicode 模式。
<?php
$str = "php編程";
if (preg_match("/^[\x{4e00}-\x{9fa5}]+$/u", $str)) {
print("該字符串全部是中文");
} else {
print("該字符串不全部是中文");
}
?>
u 修飾符:UTF-8 正則必須加 u,否則會按字節匹配導致錯誤。\p{Han}(需 PCRE 8.1+),例:/^\p{Han}+$/u。mb_check_encoding() 或 mb_ereg() 等多字節原生函數。| 場景 | GBK 正則 | UTF-8 正則 |
|---|---|---|
| 純中文檢測 | /^([\x81-\xFE][\x40-\xFE])+$/ | /^[\x{4e00}-\x{9fa5}]+$/u |
| 包含中文檢測 | /([\x81-\xFE][\x40-\xFE])/ | /[\x{4e00}-\x{9fa5}]/u |
| 中英數混合提取 | 較複雜,建議轉 UTF-8 處理 | /[\x{4e00}-\x{9fa5}a-zA-Z0-9]+/u |
掌握編碼與正則的對應關係,才能在中文處理場景中游刃有餘。希望本文能為你的開發工作提供清晰參考。