字符串截斷是列表頁、摘要、SEO 描述的高頻需求。Laravel 與 CodeIgniter (CI) 均提供開箱即用的輔助函數,但實現邏輯、多字節支援、HTML 處理存在顯著差異。
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),適合等寬字體排版。用法:
use Illuminate\Support\Str;
echo Str::limit('你好世界', 6); // 你好...
echo Str::limit('Hello World', 8); // Hello...
echo Str::limit($html, 100, ' [閱讀全文]');
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*+),而非字符寬度。用法:
echo word_limiter('Hello world this is CI', 3); // Hello world this…
echo word_limiter('你好世界', 2); // 你好世界… (視為1詞)
| 維度 | Laravel Str::limit | CI word_limiter |
|---|---|---|
| 計算單位 | 視覺寬度 (mb_strwidth) | 詞元數量 (正則 \S+) |
| 中文友好度 | 高(每字算 2) | 低(整段算 1 詞) |
| 英文友好度 | 中(按字符寬度,可能截斷單詞) | 高(保持單詞完整) |
| HTML 安全 | 否 | 否 |
| 後綴可控 | 是 | 是 |
| 依賴擴展 | mbstring | 無 (核心函數) |
Html::limit() (Laravel) 或引入 HTMLPurifier / Masterminds\HTML5 解析 DOM 後按節點截取。jieba-php / scws 進行語義分詞後再限制詞數。Text::excerpt($html, $length, $suffix) 內部路由到最佳策略,業務代碼統一調用。