正則匹配中文漢字時,編碼不同(UTF-8 vs GBK/GB2312)、語言不同(PHP vs JS)寫法皆有差異。本文整理最實用的模式,涵蓋「純中文」、「中英數混合」、「長度限制」等常見需求。
常用漢字區間:U+4E00 ~ U+9FA5(CJK Unified Ideographs 基本區)。
// 完整字串皆為漢字
if (preg_match('/^[\x{4e00}-\x{9fa5}]+$/u', $str)) { ... }
// 允許中英數下劃線
if (preg_match('/^[\x{4e00}-\x{9fa5}A-Za-z0-9_]+$/u', $str)) { ... }
關鍵:/u 修飾符啟用 UTF-8 模式,\x{...} 為十六進位 Unicode 碼位。
或用更精確的 EUC-CN 範圍(較少用)。
preg_match_all('/[\x{4e00}-\x{9fa5}]+/u', $str, $matches);
// $matches[0] 為所有中文片段陣列
function mb_strlen_mixed($str) {
return mb_strlen($str, 'utf-8') + strlen($str) - mb_strlen($str, 'latin1');
// 簡易近似:總位元組數 - ASCII字元數 = 中文字元數*2 + 英文字元數*1
}
var reg = /^[\u4e00-\u9fa5]+$/;
if (reg.test(str)) { alert('全是漢字'); }
JS 用 \uXXXX 表示 Unicode 碼位。
var reg = /[^\x00-\xff]/; // 匹配非 ASCII 字元
String.prototype.len = function() {
return this.replace(/[^\x00-\xff]/g, 'aa').length;
};
| 修飾符 | 意義 |
|---|---|
u (PHP) | 模式視為 UTF-8,\x{...} 生效 |
i | 大小寫不敏感 |
s | . 匹配換行符 |
x | 忽略模式中的空白與註解(可讀性) |
// PHP: 2-4 個漢字
/^[\x{4e00}-\x{9fa5}]{2,4}$/u
// JS: 2-4 個漢字
/^[\u4e00-\u9fa5]{2,4}$/
<meta charset="utf-8">、JS 檔案皆為 UTF-8,避免編碼地獄。\x{...},JS 用 \u...,以建構腳本同步產出。