
本文介绍在 Laravel 中正确处理富文本内容:先移除 HTML 标签,再解码并清理残留的 HTML 实体(如 、 等),最后安全截取前 100 字符作为博客摘要。
本文介绍在 laravel 中正确处理富文本内容:先移除 html 标签,再解码并清理残留的 html 实体(如 ` `、`` 等),最后安全截取前 100 字符作为博客摘要。
在 Laravel 中使用 strip_tags() 是清除 HTML 标签的第一步,但它不会处理 HTML 实体编码(如 、、&、" 等)。这些实体在浏览器中会被渲染为空格、Unicode 控制字符或符号,导致 Str::limit() 截取后仍显示异常空白或乱码。
✅ 正确做法是:先解码 HTML 实体,再清理冗余空格与不可见字符,而非简单字符串替换。推荐使用以下健壮方案:
// 在 Controller 或 Accessor 中处理
$content = $post->content;
$plainText = strip_tags($content); // 移除所有 HTML 标签
$decoded = html_entity_decode($plainText, ENT_QUOTES, 'UTF-8'); // 安全解码实体(支持 , ‏ 等)
$cleaned = preg_replace('/[\x{200E}-\x{200F}\x{202A}-\x{202E}]/u', '', $decoded); // 移除 Unicode 双向控制符(如 ‏ 对应 \u200f)
$normalized = preg_replace('/\s+/u', ' ', $cleaned); // 合并连续空白符(含 解码后的空格)为单个空格
$trimmed = trim($normalized);
// 传给视图
return view('posts.index', ['excerpt' => Str::limit($trimmed, 100, ' …')]);Blade 模板中直接使用:
{{ $excerpt }}⚠️ 注意事项:
立即学习“前端免费学习笔记(深入)”;
- ❌ 避免仅用
str_replace(' ', ' ', ...)—— 实体可能被编码为 (无分号)、或,正则+html_entity_decode()才能全覆盖; - ❌ 不要跳过
ENT_QUOTES参数 —— 否则单引号'实体(如')无法正确还原; - ✅ 若需更高安全性(如防范 XSS 后遗症),可叠加
trim()和mb_substr()替代Str::limit(),避免在多字节字符中间截断; - ? 建议将该逻辑封装为 Eloquent 访问器,提升复用性与可维护性:
// 在 Post 模型中
protected $appends = ['excerpt'];
public function getExcerptAttribute()
{
$text = strip_tags($this->content);
$decoded = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
$cleaned = preg_replace('/[\x{200E}-\x{200F}\x{202A}-\x{202E}]/u', '', $decoded);
$normalized = preg_replace('/\s+/u', ' ', $cleaned);
return Str::limit(trim($normalized), 100, ' …');
}如此处理后,输出将纯净、可读、国际化兼容,真正实现「所见即所得」的摘要展示。



















