You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Blade中使用substr截取后无法显示原始HTML数据的问题

解决Laravel中截取HTML内容无法正常显示的问题

看起来你遇到的问题主要有两个可能的原因:要么是直接用substr截断了HTML标签导致页面渲染异常,要么是你的内容包含多字节字符(比如中文),substr按字节截取引发了乱码。咱们一步步来解决:

为什么原来的写法不行?

你用{!! $blog->description !!}能正常显示,是因为它直接输出了完整的HTML内容,所有标签都是闭合状态。但一旦用substr直接截取,很可能会把中间的HTML标签砍断(比如把<p>这是一段长文本截成<p>这是一段),浏览器无法识别不完整的标签,自然就会出现显示异常。另外,如果你的内容有中文这类多字节字符,substr是按字节截取的,很容易把一个字符劈成两半,导致乱码。

解决方案1:截取纯文本(不保留HTML格式)

如果不需要保留原有的排版样式,先把所有HTML标签去掉,再安全截取:

{!! mb_substr(strip_tags($blog->description), 0, 200) !!}
  • strip_tags($blog->description):去掉所有HTML标签,只保留纯文本内容;
  • mb_substr:替代substr,支持多字节字符,避免中文等内容乱码;
  • 如果需要在截取后加省略号,直接拼接即可:
{!! mb_substr(strip_tags($blog->description), 0, 200) . '...' !!}

解决方案2:保留HTML格式,安全截取完整标签

如果需要保留原有的HTML样式(比如段落、加粗等),直接截取容易破坏标签结构,这时候可以用Laravel内置的字符串工具类,或者自己简单处理标签闭合。这里推荐用Str::limit结合标签过滤:

use Illuminate\Support\Str;

// 先过滤掉不安全的标签,只保留需要的样式标签,再截取
$cleanedDescription = strip_tags($blog->description, '<p><b><i>'); // 允许保留指定标签
{!! Str::limit($cleanedDescription, 200) !!}

strip_tags的第二个参数可以指定允许保留的标签,这样既保留了必要的样式,又避免了截断未知标签的风险。Str::limit默认支持多字节字符,比substr更安全。

如果想要更精准的HTML截断(确保所有标签都闭合),可以考虑使用专门的HTML处理库,不过对于大多数场景,上面的方法已经足够解决问题了。

内容的提问来源于stack exchange,提问作者sigmato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:17:28