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

Laravel 與 CodeIgniter 字符串截取輔助函數對比:Str::limit vs word_limiter

     編輯:PHP 相關知識

兩大框架內置截斷函數實現原理、參數差異與使用場景

字符串截斷是列表頁、摘要、SEO 描述的高頻需求。Laravel 與 CodeIgniter (CI) 均提供開箱即用的輔助函數,但實現邏輯、多字節支援、HTML 處理存在顯著差異。

Laravel: Str::limit() (Illuminate\Support\Str)

// 實現源碼 (簡化)
public static function limit($value, $limit = 100, $end = '...')
{
    if (mb_strwidth($value, 'UTF-8') <= $limit) {
        return $value;
    }
    return rtrim(mb_strimwidth($value, 0, $limit, '', 'UTF-8')) . $end;
}

特點:

  • 基於 mb_strwidth/mb_strimwidth,按視覺寬度計算(中文算 2,英文算 1),適合等寬字體排版。
  • 自動去除末尾空白再追加後綴。
  • 不處理 HTML 標籤,若輸入含標籤可能截斷導致結構破壞。

用法:

use Illuminate\Support\Str;
echo Str::limit('你好世界', 6);        // 你好...
echo Str::limit('Hello World', 8);     // Hello...
echo Str::limit($html, 100, ' [閱讀全文]');

CodeIgniter: word_limiter()

// 實現源碼 (簡化)
function word_limiter($str, $limit = 100, $end_char = '…')
{
    if (trim($str) === '') return $str;
    // 正則匹配前 $limit 個「單詞」(非空白序列)
    preg_match('/^\s*+(?:\S++\s*+){1,'.(int)$limit.'}/', $str, $matches);
    if (strlen($str) === strlen($matches[0])) $end_char = '';
    return rtrim($matches[0]) . $end_char;
}

特點:

  • 按單詞/詞元數量截取(正則 \S++\s*+),而非字符寬度。
  • 英文場景下語義更完整(不會截斷單詞中間)。
  • 中文無分隔符時,整段視為一個「詞」,可能一次性輸出超長內容。
  • 同樣不處理 HTML。

用法:

echo word_limiter('Hello world this is CI', 3); // Hello world this…
echo word_limiter('你好世界', 2);              // 你好世界… (視為1詞)

對比總結表

維度Laravel Str::limitCI word_limiter
計算單位視覺寬度 (mb_strwidth)詞元數量 (正則 \S+)
中文友好度高(每字算 2)低(整段算 1 詞)
英文友好度中(按字符寬度,可能截斷單詞)高(保持單詞完整)
HTML 安全否否
後綴可控是是
依賴擴展mbstring無 (核心函數)

生產環境增強建議

  1. HTML 安全截斷:使用 Html::limit() (Laravel) 或引入 HTMLPurifier / Masterminds\HTML5 解析 DOM 後按節點截取。
  2. 中文分詞:結合 jieba-php / scws 進行語義分詞後再限制詞數。
  3. 統一工具類:專案中封裝 Text::excerpt($html, $length, $suffix) 內部路由到最佳策略,業務代碼統一調用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved