
在 Laravel 9 中使用 SummerNote 存储富文本后,通过 Str::of()->limit() 截取并渲染时可能因链式调用与 HTML 转义逻辑冲突导致内容空白;应改用原生 Str::limit() 并配合 {!! !!} 安全输出。
在 laravel 9 中使用 summernote 存储富文本后,通过 `str::of($item->product_description)->limit(40)` 并用 `{!! !!}` 渲染时可能显示为空或异常——这是因为 `str::of()` 返回的是 `illuminate\support\stringable` 实例,其 `limit()` 方法默认会在末尾添加省略号(如 `…`),且当原始 html 内容含标签(如 `
`、``)时,`stringable::limit()` 在截断过程中可能破坏标签结构,导致浏览器解析失败而隐藏内容。
要安全、准确地截取并渲染富文本摘要,推荐使用 Laravel 内置的 Str::limit() 辅助函数:
{!! Str::limit($item->product_description, 40, '...') !!}
✅ 优势说明:
- Str::limit() 直接操作字符串,不经过 Stringable 链式包装,避免 DOM 解析干扰;
- 第三个参数 '...' 明确指定省略符,可自定义(如 '…' 或 '');
- 与 {!! !!} 搭配,保留原始 HTML 标签(如
、),确保格式基本可用。
⚠️ 重要注意事项:
-
XSS 风险提醒: SummerNote 输入的内容若未经服务端过滤(如 strip_tags() 或 HTMLPurifier),直接 {!! !!} 渲染存在 XSS 隐患。生产环境建议先净化 HTML:
// 在控制器或访问器中处理 use Illuminate\Support\Facades\Blade; use Tightenco\Collect\Support\Str; // 示例:使用 htmlpurifier(需安装 caxy/htmlpurifier-bundle) $cleanHtml = Purifier::clean($item->product_description);
-
若仅需纯文本摘要(忽略所有 HTML 标签),应先剥离标签再截取:
{!! Str::limit(strip_tags($item->product_description), 40) !!}
? 总结:
优先使用 Str::limit() 替代 Str::of()->limit() 处理 SummerNote 富文本字段;始终评估 HTML 安全性,避免裸 {!! !!} 渲染不可信内容;必要时结合 HTML 净化与语义化截断策略,兼顾展示效果与应用安全。











