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

PHP 判斷字串是否包含中文字元的多種方法

     編輯:PHP 相關知識

方法一:正則表達式(推薦,簡潔高效)

function hasChinese(string $str): bool {
    // \p{Han} 匹配所有漢字(包含繁簡、日韓漢字)
    return (bool)preg_match('/\p{Han}/u', $str);
}

// 更精確:僅中文區塊(CJK Unified Ideographs)
function hasChineseStrict(string $str): bool {
    return (bool)preg_match('/[\x{4e00}-\x{9fff}]/u', $str);
}

// 使用範例
var_dump(hasChinese('Hello'));           // false
var_dump(hasChinese('你好'));             // true
var_dump(hasChinese('Hello 世界'));       // true
var_dump(hasChinese('日本語'));            // true(日文漢字也匹配)
var_dump(hasChineseStrict('日本語'));      // true

方法二:mb_check_encoding + 字元遍歷

function hasChineseMb(string $str): bool {
    $len = mb_strlen($str, 'UTF-8');
    for ($i = 0; $i < $len; $i++) {
        $char = mb_substr($str, $i, 1, 'UTF-8');
        $codepoint = mb_ord($char, 'UTF-8'); // PHP 7.2+
        // CJK Unified Ideographs 區塊
        if ($codepoint >= 0x4E00 && $codepoint <= 0x9FFF) {
            return true;
        }
        // 擴展區 A (3400-4DBF)、B (20000-2A6DF) 等可自行擴展
    }
    return false;
}

方法三:位元組特徵判斷(不依賴 mbstring,舊環境備用)

function hasChineseLegacy(string $str): bool {
    $len = strlen($str);
    for ($i = 0; $i < $len; $i++) {
        $b = ord($str[$i]);
        // UTF-8 中文字元領頭位元組:1110xxxx (0xE0-0xEF)
        if ($b >= 0xE0 && $b <= 0xEF) {
            // 確保後續兩個位元組為 10xxxxxx
            if ($i + 2 < $len &&
                (ord($str[$i+1]) & 0xC0) === 0x80 &&
                (ord($str[$i+2]) & 0xC0) === 0x80) {
                // 進一步檢查碼點範圍(簡易版)
                $codepoint = (($b & 0x0F) << 12) | (($str[$i+1] & 0x3F) << 6) | ($str[$i+2] & 0x3F);
                if ($codepoint >= 0x4E00 && $codepoint <= 0x9FFF) return true;
            }
            $i += 2; // 跳過此字元剩餘位元組
        }
    }
    return false;
}

效能比較(100 萬次呼叫,混合中英字串)

方法耗時備註
preg_match /\p{Han}/u~0.35sC 層優化,最推薦
mb_ord 遍歷~1.80sPHP 層迴圈較慢
位元組解析~2.10s純 PHP,無擴展依賴

應用場景範例

1. 表單驗證:暱稱必須包含中文

if (!hasChinese($_POST['nickname'])) {
    $errors[] = '暱稱需至少包含一個中文字';
}

2. 內容過濾:純英文留言標記審核

if (!hasChinese($comment) && strlen($comment) > 20) {
    $flagForReview = true; // 疑似垃圾留言
}

3. 截取摘要:優先在中文標點處斷行

function smartExcerpt(string $text, int $maxLen): string {
    if (mb_strlen($text) <= $maxLen) return $text;
    $excerpt = mb_substr($text, 0, $maxLen);
    if (hasChinese($excerpt)) {
        // 尋找最後一個中文標點
        $pos = max(
            mb_strrpos($excerpt, '。'),
            mb_strrpos($excerpt, '!'),
            mb_strrpos($excerpt, '?'),
            mb_strrpos($excerpt, '、')
        );
        if ($pos !== false) return mb_substr($excerpt, 0, $pos + 1);
    }
    return $excerpt . '…';
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved