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

PHP 正則表達式匹配中文字符:Unicode 屬性、範圍與實戰驗證

     編輯:PHP 相關知識

前言

在 UTF-8 編碼下,中文字符不再是簡單的字節範圍(GBK 時代 [\x80-\xFF]),而是分佈在 Unicode 的多個區塊。PHP 正則支援 Unicode 屬性(\p{Han})、代碼點範圍、字符類別。本文系統講解匹配中文的正則模式、修飾符、驗證純中文/含中文/提取中文的實戰範例。

Unicode 中文相關區塊

正則模式大全

1. Unicode 屬性 (推薦,PHP 5.1+ 需 PCRE 8.10+)

/^\p{Han}+$/u        // 純漢字 (不含標點)
/^[\p{Han}\p{P}]+$/u // 漢字+標點
/[\p{Han}]/u         // 含漢字
  • \p{Han} 匹配所有漢字字符(上述所有區塊)。
  • 必須加 /u 修飾符 啟用 UTF-8 模式。

2. 代碼點範圍 (兼容舊 PCRE)

/^[\x{4e00}-\x{9fff}]+$/u        // 基本漢字
/^[\x{3400}-\x{4dbf}\x{4e00}-\x{9fff}\x{f900}-\x{faff}]+$/u // 含擴展 A、兼容

3. 匹配中文標點符號

/[\x{3000}-\x{303f}\x{ff00}-\x{ffef}]/u

4. 實戰驗證函數

<?php
function validateChinese(string $str, string $type = 'pure'): bool {
    $patterns = [
        'pure' => '/^\p{Han}+$/u',                    // 純漢字
        'with_punct' => '/^[\p{Han}\p{P}]+$/u',       // 漢字+標點
        'alphanum' => '/^[\p{Han}\p{L}\p{N}]+$/u',    // 漢字+字母+數字
        'contains' => '/\p{Han}/u',                   // 含漢字
        'extract' => '/\p{Han}+/u',                   // 提取漢字片段
    ];
    $pattern = $patterns[$type] ?? $patterns['pure'];
    return (bool)preg_match($pattern, $str);
}

// 測試
$tests = [
    '中文測試' => true,
    '中文,測試!' => false, // pure
    '中文,測試!' => true,  // with_punct
    'Hello世界' => true,   // alphanum
    'Hello' => false,      // contains
    '123' => false,
    '' => false,
];

foreach ($tests as $input => $expected) {
    $result = validateChinese($input, 'pure');
    echo "'$input': " . ($result === $expected ? '✓' : '✗') . "\n";
}
?>

常見陷阱

區塊範圍說明
CJK Unified IdeographsU+4E00~U+9FFF常用漢字 20,992 字
CJK Unified Ideographs Extension AU+3400~U+4DBF擴展 A 6,592 字
CJK Unified Ideographs Extension BU+20000~U+2A6DF擴展 B 42,720 字 (罕見字)
CJK Compatibility IdeographsU+F900~U+FAFF兼容漢字
CJK Symbols and PunctuationU+3000~U+303F標點符號(全形空格、括號等)
Halfwidth and Fullwidth FormsU+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} 組合。

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