在處理中英文混排字串截取時,傳統做法常涉及 ASCII 碼判斷、十六進制轉換、正則匹配或迴圈計數,邏輯繁瑣且易出錯。PHP 的 mbstring 擴展提供了 mb_strwidth() 與 mb_strimwidth() 兩大函式,能以「視覺寬度」為單位精準計算與截取字串,極大簡化開發工作。
mb_strwidth(string $str, string $encoding = mb_internal_encoding()): int
$str:待測量字串$encoding:字元編碼(如 UTF-8、GBK),預設為內部編碼mb_strimwidth(string $str, int $start, int $width, string $trimmarker = "", string $encoding = mb_internal_encoding()): string
$start:起始位置(以寬度為單位,預設 0)$width:截取寬度$trimmarker:尾部附加字串(如 ...),其寬度也計入總寬度$encoding:字元編碼<?php
// 設定內部編碼為 UTF-8
mb_internal_encoding('UTF-8');
$str = 'aaaa啊啊aaaa啊啊啊aaa';
// 僅用 strlen 會得到位元組數(25),非視覺寬度
echo "strlen: " . strlen($str) . "\n"; // 25
// mb_strwidth 正確反映視覺寬度:4個a(4) + 2個啊(4) + 4個a(4) + 3個啊(6) + 3個a(3) = 21
echo "mb_strwidth: " . mb_strwidth($str, 'UTF-8') . "\n"; // 21
// 寬度超過 10 才截取
if (mb_strwidth($str, 'UTF-8') > 10) {
// 從 0 開始,取寬度 10,附加 '...'(佔 3 寬度),實際內容寬度 7
$str = mb_strimwidth($str, 0, 10, '...', 'UTF-8');
}
echo "結果: $str\n"; // 輸出: aaaa啊...
// 解析: aaaa(4) + 啊(2) + ...(3) = 9 寬度(接近 10)
?>
mb_internal_encoding('UTF-8') 或在每個函式傳遞 'UTF-8',否則會使用 PHP 內部編碼導致結果偏差。$trimmarker 的寬度包含在 $width 內,預留足夠空間。善用 mb_strwidth 與 mb_strimwidth,配合正確的編碼設定,即可輕鬆實現中英混排字串的精準截取,代碼簡潔且效能優異,是 PHP 開發者處理多語言文本的利器。