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

PHP 處理中英混排字串截取:mb_strimwidth 實戰指南

     編輯:PHP 綜合知識

前言

在處理中英文混排字串截取時,傳統做法常涉及 ASCII 碼判斷、十六進制轉換、正則匹配或迴圈計數,邏輯繁瑣且易出錯。PHP 的 mbstring 擴展提供了 mb_strwidth() 與 mb_strimwidth() 兩大函式,能以「視覺寬度」為單位精準計算與截取字串,極大簡化開發工作。

核心函式介紹

1. mb_strwidth() — 取得字串視覺寬度

mb_strwidth(string $str, string $encoding = mb_internal_encoding()): int
  • $str:待測量字串
  • $encoding:字元編碼(如 UTF-8、GBK),預設為內部編碼
  • 規則:ASCII 字元(英文、數字、符號)寬度為 1;中日韓(CJK)字元寬度為 2

2. mb_strimwidth() — 按視覺寬度截取字串

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

關鍵注意事項

  1. 務必設定編碼:呼叫 mb_internal_encoding('UTF-8') 或在每個函式傳遞 'UTF-8',否則會使用 PHP 內部編碼導致結果偏差。
  2. 尾部標記計入寬度:$trimmarker 的寬度包含在 $width 內,預留足夠空間。
  3. 適用場景:文章摘要、列表標題截斷、多語言介面文字截取等。

總結

善用 mb_strwidth 與 mb_strimwidth,配合正確的編碼設定,即可輕鬆實現中英混排字串的精準截取,代碼簡潔且效能優異,是 PHP 開發者處理多語言文本的利器。

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