在 PHP 中使用正則表達式匹配中文時,常遇到 Compilation failed: PCRE does not support... 錯誤。這是因為 PHP 的 PCRE 引擎不支援 Perl 風格的 \uXXXX Unicode 轉義序列,必須改用 \x{XXXX} 格式,並加上 u 修飾符啟用 UTF-8 模式。
<?php
$str = '中華人民共和國123456789abcdefg';
// 錯誤:\u 不被支援
preg_match("/^[\u4e00-\u9fa5_a-zA-Z0-9]{3,15}$/", $str);
<?php
// 1. 使用 \x{XXXX} 格式 + u 修飾符
preg_match("/^[\x{4e00}-\x{9fa5}_a-zA-Z0-9]{3,15}$/u", $str);
// 2. 僅匹配中文(基本平面常用漢字區)
$str = "php編程";
if (preg_match("/^[\x{4e00}-\x{9fa5}]+$/u", $str)) {
echo "全為中文";
} else {
echo "包含非中文";
}
| 編碼 | 範圍 | 說明 |
|---|---|---|
| GBK/GB2312 | \x80-\xff | 中文雙位元組範圍 |
| UTF-8 | \x{4e00}-\x{9fa5} | 基本平面常用漢字(約 2 萬字) |
| UTF-8 | \x{3400}-\x{4dbf} | 擴展 A 區 |
| UTF-8 | \x{20000}-\x{2a6df} | 擴展 B 區(罕見字) |
| UTF-8 | \x{ac00}-\x{d7a3} | 韓文音節 |
| UTF-8 | \x{3040}-\x{309f} | 日文平假名 |
| UTF-8 | \x{30a0}-\x{30ff} | 日文片假名 |
<?php
/**
* 判斷字串是否僅包含中文(基本平面)
*/
function isPureChinese(string $str): bool
{
return (bool)preg_match('/^[\x{4e00}-\x{9fa5}]+$/u', $str);
}
/**
* 判斷字串是否包含中文
*/
function containsChinese(string $str): bool
{
return (bool)preg_match('/[\x{4e00}-\x{9fa5}]/u', $str);
}
/**
* 過濾非中英數字元(保留中文、英文、數字、底線)
*/
function filterSafeChars(string $str): string
{
return preg_replace('/[^\x{4e00}-\x{9fa5}a-zA-Z0-9_]/u', '', $str);
}
// 測試
var_dump(isPureChinese('測試')); // true
var_dump(isPureChinese('test123')); // false
var_dump(containsChinese('abc測試')); // true
echo filterSafeChars('測試@#$123abc'); // 測試123abc
?>
\x{XXXX} 而非 \uXXXX。u 修飾符(/pattern/u),否則會以單位元組處理導致錯誤。\x{4e00}-\x{9fa5} 已涵蓋 99% 常用漢字;罕見字需擴展範圍。[\x80-\xff],但強烈建議專案統一使用 UTF-8。掌握上述規則,即能在 PHP 中穩健處理中文正則匹配需求。