在 UTF-8 編碼下,中文字符不再是簡單的字節範圍(GBK 時代 [\x80-\xFF]),而是分佈在 Unicode 的多個區塊。PHP 正則支援 Unicode 屬性(\p{Han})、代碼點範圍、字符類別。本文系統講解匹配中文的正則模式、修飾符、驗證純中文/含中文/提取中文的實戰範例。
| 區塊 | 範圍 | 說明 |
|---|---|---|
| CJK Unified Ideographs | U+4E00~U+9FFF | 常用漢字 20,992 字 |
| CJK Unified Ideographs Extension A | U+3400~U+4DBF | 擴展 A 6,592 字 |
| CJK Unified Ideographs Extension B | U+20000~U+2A6DF | 擴展 B 42,720 字 (罕見字) |
| CJK Compatibility Ideographs | U+F900~U+FAFF | 兼容漢字 |
| CJK Symbols and Punctuation | U+3000~U+303F | 標點符號(全形空格、括號等) |
| Halfwidth and Fullwidth Forms | U+FF00~U+FFEF | 全形/半形字符 |
| 陷阱 | 原因 | 修正 |
|---|---|---|
/^[\u4e00-\u9fa5]+$/ 語法錯誤 | PHP 正則不支援 \uXXXX,需 \x{XXXX} | 用 /\x{4e00}-\x{9fa5}/ |
未加 /u 修飾符 | 按字節匹配,UTF-8 中文 3 字節被拆分 | 必須加 /u |
preg_match('/^[\x80-\xFF]+$/', $utf8Str) | GBK 時代遺留模式,UTF-8 無效 | 改用 \p{Han} 或代碼點範圍 |
| 匹配全形數字/字母 | \p{Han} 不含全形 ASCII | 需額外加 \x{FF00}-\x{FFEF} |
| Emoji/生僻字匹配失敗 | 屬於 Supplementary Planes (U+10000+) | \p{Han} 自動包含,/u 支援 |
<?php
$text = 'PHP正則表達式匹配中文測試:Hello 世界!😀';
preg_match_all('/\p{Han}+/u', $text, $matches);
print_r($matches[0]);
/*
Array
(
[0] => PHP正則表達式匹配中文測試
[1] => 世界
)
*/
?>
匹配中文首選 /\p{Han}/u,簡潔、完整覆蓋所有 Unicode 漢字區塊、自動支援生僻字。舊環境無 PCRE Unicode 支援時,用代碼點範圍 /\x{4e00}-\x{9fff}/u。務必加 /u 修飾符。驗證純中文、含中文、提取中文,根據業務選擇 \p{Han}、\p{P}、\p{L}、\p{N} 組合。