判斷字串是否為純中文,核心在於字元編碼範圍。不同編碼(GB2312/GBK、UTF-8)對應的中文區間不同,驗證邏輯也須隨之調整。本文整理 PHP 與 JavaScript 兩大語言的常用寫法,並說明常見陷阱。
[\xA1-\xFF] 匹配雙位元組字元。U+4E00–U+9FA5(基本漢字區),對應 UTF-8 三位元組序列 \xE4\xB8\x80–\xE9\xBE\xA5。$str = "一聚教程網";
if (preg_match('/^['.chr(0xA1).'-'.chr(0xFF).']+$/', $str)) {
echo "純中文字串";
} else {
echo "含非中文字元";
}
利用 chr() 動態產生位元組範圍,避免硬編碼。
$str = "php編程";
if (preg_match('/^[\x{4e00}-\x{9fa5}]+$/u', $str)) {
echo "純中文字串";
}
u 修飾符啟用 Unicode 模式。\x{4e00}-\x{9fa5} 直接對應碼位,不受位元組序列影響,更直觀。if ($is_utf8) {
// 保留英數、底線、中文、常見符號
$joid = preg_replace('/[^0-9a-zA-Z_\-\x{4e00}-\x{9fa5}:\/#.]/u', '', $joid);
} else {
// GB2312/GBK
$joid = preg_replace('/[^0-9a-zA-Z_\-\xA1-\xFF:\/#.]/', '', $joid);
}
JS 內部使用 UTF-16,直接匹配 Unicode 碼位最簡單:
var str = "php編程";
if (/^[\u4e00-\u9fa5]+$/.test(str)) {
alert("全為中文");
} else {
alert("含非中文");
}
\u4e00-\u9fa5 對應基本漢字區。\u3400-\u4DBF),可自行擴充範圍。/^[\u4e00-\u9fa5]+$/ 在 PHP 非 Unicode 模式下 —— 會把 UTF-8 位元組拆開匹配,導致誤判。務必加 u 修飾符。<meta charset="utf-8">、資料庫連線 SET NAMES utf8mb4、PHP mb_internal_encoding('UTF-8') 三者保持一致。中文驗證的本質是碼位範圍判斷。現代專案建議全鏈路使用 UTF-8(或 utf8mb4),在 PHP 用 /^[\x{4e00}-\x{9fa5}]+$/u,在 JS 用 /^[\u4e00-\u9fa5]+$/,簡潔且可維護。