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

PHP 字符串中間截取並用省略號替換:保留完整單詞的智能截斷函數

     編輯:PHP 相關知識

PHP 字符串中間截取並用省略號替換:保留完整單詞的智能截斷函數

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

核心邏輯圖解

  1. 計算可保留字符數 = 最大長度 - 替換符長度。
  2. 平均分配給首尾(奇數時尾部多 1)。
  3. 從理論分割點向外擴展,尋找最近的空格作為實際截斷點,確保單詞完整。
  4. 左半部保留至空格前 + 替換符,右半部保留空格後至末尾。
  5. 若全程無空格(極長單詞),退化為硬性截取。

多語言環境注意事項

  • 中文/日文/韓文: 無空格分詞,上述邏輯會退化為硬截取。建議改用 mb_substr + 固定長度截取,或引入分詞庫(如 jieba-php)。
  • UTF-8 多字節: 原函數基於字節操作,中文字符會被拆分產生亂碼。需將 strlen/substr 替換為 mb_strlen/mb_substr 並指定編碼。

改進版:支援 UTF-8 與中文

<?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:45User login from 192... 10:30:45
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved