萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 正則表達式匹配中文字元完整指南

編碼決定正則模式

中文正則匹配模式取決於檔案/字串編碼:

編碼範圍正則模式修飾符
GBK/GB2312漢字區[\x80-\xff]+ 或 [\xa1-\xff]+無
UTF-8基本漢字[\x{4e00}-\x{9fa5}]+/u (PCRE_UTF8)
UTF-8擴展區[\x{4e00}-\x{9fff}]+/u

UTF-8 環境實務範例

提取所有中文字

<?php
$str = '學習 PHP 是一件快樂的事。Hello World!';
preg_match_all('/[\x{4e00}-\x{9fa5}]+/u', $str, $matches);
print_r($matches[0]);
/*
Array
(
    [0] => 學習
    [1] => 是一件快樂的事
)
*/
?>

判斷純中文字串

function isPureChinese($str): bool {
    return (bool)preg_match('/^[\x{4e00}-\x{9fa5}]+$/u', $str);
}

var_dump(isPureChinese('測試字串')); // true
var_dump(isPureChinese('Test123'));  // false
var_dump(isPureChinese('測試123'));  // false

判斷是否包含中文

function hasChinese($str): bool {
    return (bool)preg_match('/[\x{4e00}-\x{9fa5}]/u', $str);
}

GBK/GB2312 環境範例

<?php
// 檔案儲存為 GBK 編碼
$str = '中文測試';
if (preg_match('/^[\x80-\xff]+$/', $str)) {
    echo '全是中文';
} else {
    echo '包含非中文';
}

// 更精確的 GB2312 範圍
if (preg_match('/^[\xb0-\xf7][\xa0-\xfe]+$/', $str)) {
    echo '符合 GB2312 漢字編碼規範';
}

常見應用場景

1. 中文姓名驗證(2-10 字)

function validateChineseName($name): bool {
    return (bool)preg_match('/^[\x{4e00}-\x{9fa5}]{2,10}$/u', $name);
}

2. 過濾輸入中的中文

$filtered = preg_replace('/[\x{4e00}-\x{9fa5}]/u', '', $input); // 移除中文
$onlyChinese = preg_replace('/[^\x{4e00}-\x{9fa5}]/u', '', $input); // 只保留中文

3. 分詞輔助:中英文分離

$str = 'PHP中文網';
preg_match_all('/([\x{4e00}-\x{9fa5}]+|[a-zA-Z0-9]+)/u', $str, $m);
print_r($m[0]); // ['PHP', '中文網']

效能與替代方案

  • mbstring 函式:mb_ereg()、mb_strlen() 等原生支援多位元組
  • preg_match() 配合 /u 修飾符通常效能足夠
  • 大量文字處理考慮 intl 擴展的 BreakIterator

避坑指南

  1. 確認 PHP 檔案編碼為 UTF-8(無 BOM)
  2. 資料庫連線、HTML meta、HTTP Header 皆設 UTF-8
  3. 正則必須加 /u 修飾符,否則按單位元組匹配導致錯誤
  4. 範圍 \x{4e00}-\x{9fa5} 涵蓋常用漢字,罕見字可能在擴展區
  5. 不要用 . 匹配中文(單位元組模式下匹配半個字元)
copyright © 萬盛學電腦網 all rights reserved