首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 正則匹配 Unicode 編碼字符的專業寫法

     編輯:PHP 相關知識

背景

處理中文、日文、Emoji 等 Unicode 字符時,傳統 [\u4e00-\u9fa5] 僅覆蓋基本多文種平面(BMP)常用漢字,無法匹配擴展區漢字、生僻字、Emoji(補充平面 SMP)。需使用 PHP PCRE 的 Unicode 屬性語法。

核心語法:\x{XXXX} 與 Unicode 屬性

<?php
// 1. 直接指定碼點範圍(十六進制)
// 基本漢字區:U+4E00-U+9FA5
// 擴展 A:U+3400-U+4DBF
// 擴展 B:U+20000-U+2A6DF(需 PCRE 8.32+ 支持 >FFFF)
$pattern = '/[\x{4e00}-\x{9fa5}\x{3400}-\x{4dbf}]/u';

// 2. 使用 Unicode 字符屬性(推薦,語義化、自動覆蓋所有區塊)
// \p{Han}:所有漢字(含擴展區)
// \p{L}:所有字母
// \p{N}:所有數字
// \p{P}:所有標點
// \p{Script=Han}:漢字腳本(更精確)
$pattern = '/\p{Han}+/u';          // 匹配連續漢字
$pattern = '/[\p{Han}\p{L}\p{N}]+/u'; // 漢字+字母+數字

// 3. 匹配 Emoji(補充平面,U+10000+)
// \p{So}:其他符號(含 Emoji)
// 更精確:\p{Extended_Pictographic} (PCRE 10.32+)
$emojiPattern = '/\p{So}/u'; 
?>

實戰範例:過濾/提取 Unicode 內容

<?php
$text = "Hello 世界 🌍 𠮷𠮷𠮷 Test123!";

// 1. 提取所有漢字(含生僻字 𠮷 U+20BB7)
preg_match_all('/\p{Han}+/u', $text, $matches);
var_dump($matches[0]); // ["世界", "𠮷𠮷𠮷"]

// 2. 移除所有 Emoji
$clean = preg_replace('/\p{So}/u', '', $text);
echo $clean; // "Hello 世界  𠮷𠮷𠮷 Test123!"

// 3. 只保留漢字、字母、數字、常用標點
$filtered = preg_replace('/[^\p{Han}\p{L}\p{N}\p{P}\s]/u', '', $text);
echo $filtered; // "Hello 世界  𠮷𠮷𠮷 Test123!"

// 4. 驗證純中文(含生僻字)
function isPureChinese($str) {
    return (bool)preg_match('/^[\p{Han}]+$/u', $str);
}
var_dump(isPureChinese('世界𠮷')); // true
var_dump(isPureChinese('World'));  // false
?>

關鍵修飾符:u (PCRE_UTF8)

必須在正則結尾加 u 修飾符:
/\p{Han}/u ✅ 正確按 Unicode 字符匹配
/\p{Han}/ ❌ 按字節匹配,會將多字節字符拆分,導致錯誤匹配或報錯

Unicode 碼點範圍速查(常用區塊)

區塊名稱碼點範圍說明
CJK 統一表意文字U+4E00 - U+9FFF常用漢字 20992 個
CJK 統一表意文字擴展 AU+3400 - U+4DBF生僻漢字 6592 個
CJK 統一表意文字擴展 BU+20000 - U+2A6DF極生僻漢字 42720 個
CJK 兼容表意文字U+F900 - U+FAFF兼容字符
CJK 符號和標點U+3000 - U+303F全角標點、空格等
半形及全形字符U+FF00 - U+FFEF全角字母數字符號
Emoji / 補充符號和象形文字U+1F000 - U+1FAFF彩色表情符號

進階:PCRE 版本要求

  • PHP 5.3.4+ (PCRE 8.10+):支持 \x{FFFF}(BMP 內)。
  • PHP 5.4.14+ (PCRE 8.32+):支持 \x{10000} 以上碼點(補充平面,如 Emoji、擴展 B)。
  • PHP 7.3+ (PCRE 10.32+):支持 \p{Extended_Pictographic} 精確匹配 Emoji。

檢查版本:php -r "echo PCRE_VERSION;"

總結

  1. 匹配漢字:/\p{Han}+/u(最語義化、覆蓋全)。
  2. 匹配 Emoji:/\p{So}/u 或 /\p{Extended_Pictographic}/u(新版)。
  3. 自定義範圍:/[\x{4e00}-\x{9fa5}\x{3400}-\x{4dbf}]/u。
  4. 永遠加 u 修飾符,否則按字節匹配必出錯。
  5. 生產環境建議 PHP 7.3+,獲得最新 Unicode 屬性支持。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved