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

PHP 正則表達式匹配中文完整指南:避坑與最佳實踐

     編輯:PHP 相關知識

問題背景

在 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);

✅ 正確寫法(UTF-8 模式)

<?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
?>

避坑重點總結

  1. 必須使用 \x{XXXX} 而非 \uXXXX。
  2. 務必加上 u 修飾符(/pattern/u),否則會以單位元組處理導致錯誤。
  3. PHP 字串預設為 ISO-8859-1,來源資料若為 UTF-8 需確認編碼一致。
  4. 基本平面 \x{4e00}-\x{9fa5} 已涵蓋 99% 常用漢字;罕見字需擴展範圍。
  5. GBK 環境下可用 [\x80-\xff],但強烈建議專案統一使用 UTF-8。

掌握上述規則,即能在 PHP 中穩健處理中文正則匹配需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved