在 UI 顯示長文本(如文章標題、路徑、日誌)時,常需保留首尾關鍵信息,中間用省略號代替。本文提供一個單詞敏感的中間截斷函數 strMiddleReduceWordSensitive(),避免單詞被拆分,支援自定義最大長度與替換符號。
<?php
/**
* 中間截取字符串,保留完整單詞
* @param string $string 原字符串
* @param int $max 最大長度(含替換符)
* @param string $rep 替換符號,預設 [...]
* @return string
*/
function strMiddleReduceWordSensitive($string, $max = 50, $rep = '[...]') {
$strlen = strlen($string);
if ($strlen <= $max) return $string;
$lengthToKeep = $max - strlen($rep);
$start = $end = 0;
// 分配首尾保留長度
if (($lengthToKeep % 2) == 0) {
$start = $lengthToKeep / 2;
$end = $start;
} else {
$start = intval($lengthToKeep / 2);
$end = $start + 1;
}
// 從中間向右尋找空格作為截斷點
$i = $start;
$tmpString = $string;
while ($i < $strlen) {
if (isset($tmpString[$i]) && $tmpString[$i] == ' ') {
$tmpString = substr($tmpString, 0, $i) . $rep;
$return = $tmpString;
break;
}
$i++;
}
// 從中間向左尋找空格(反轉字符串處理)
$i = $end;
$tmpString = strrev($string);
while ($i < $strlen) {
if (isset($tmpString[$i]) && $tmpString[$i] == ' ') {
$tmpString = substr($tmpString, 0, $i);
$return .= strrev($tmpString);
break;
}
$i++;
}
return isset($return) ? $return : substr($string, 0, $start) . $rep . substr($string, -$end);
}
// 測試示例
$text = 'This is a very long test sentence, bla foo bar nothing';
echo strMiddleReduceWordSensitive($text, 30) . "\n";
// Output: This is a very[...]foo bar nothing (~30 chars)
echo strMiddleReduceWordSensitive($text, 30, '...') . "\n";
// Output: This is a very...foo bar nothing (~30 chars)
?>
mb_substr + 固定長度截取,或引入分詞庫(如 jieba-php)。strlen/substr 替換為 mb_strlen/mb_substr 並指定編碼。<?php
function strMiddleReduceUtf8($string, $max = 50, $rep = '...') {
$len = mb_strlen($string, 'UTF-8');
if ($len <= $max) return $string;
$keep = $max - mb_strlen($rep, 'UTF-8');
$start = (int)($keep / 2);
$end = $keep - $start;
return mb_substr($string, 0, $start, 'UTF-8') . $rep . mb_substr($string, -$end, $end, 'UTF-8');
}
?>
| 場景 | 示例輸入 | 輸出(max=30) |
|---|---|---|
| 文章標題 | 深度解析 PHP 內核垃圾回收機制與性能調優實戰 | 深度解析 PHP 內核...能調優實戰 |
| 文件路徑 | /var/www/html/project/module/controller/action.php | /var/www/html/proj...oller/action.php |
| 日誌摘要 | User login from 192.168.1.100 at 2024-01-15 10:30:45 | User login from 192... 10:30:45 |