如何在Laravel中移除文章HTML标签并仅截取纯文本?
解决Laravel中忽略HTML标签截取纯文本的问题
嘿,这个问题我做CMS的时候也碰到过!你现在的核心问题是执行顺序搞反了——先调用str_limit再移除标签,导致HTML标签本身的字符被算进了截取长度里,最后纯文本就被过度截断了。调整一下顺序就能解决,给你几个实用的方案:
方案一:用原生辅助函数快速解决
直接把strip_tags放在str_limit前面,先把所有HTML标签清掉得到纯文本,再截取长度:
{!! str_limit(strip_tags($post->content), 230) !!}
这样str_limit统计的就是纯文本的字符数,再也不会把<p>、<strong>这些标签的字符算进去啦。
方案二:用Laravel的Str门面更优雅(推荐)
Laravel的Str类提供了链式调用的方式,代码可读性更好,适合Laravel 5.8及以上版本:
{!! \Illuminate\Support\Str::limit(\Illuminate\Support\Str::of($post->content)->stripTags(), 230) !!}
如果你的模板里已经引入了use Illuminate\Support\Str;,还能简化成:
{!! Str::limit(Str::of($post->content)->stripTags(), 230) !!}
逻辑很清晰:先把文章内容转成字符串对象,移除所有HTML标签,最后截取前230个纯文本字符。
额外优化:处理多余空格
如果移除标签后有一堆连续的空格或换行,可以再加一步优化,让文本更整洁:
{!! Str::limit(Str::of($post->content)->stripTags()->trim()->replaceMatches('/\s+/', ' '), 230) !!}
这个版本会把多个连续的空格、换行替换成单个空格,截取后的文本看起来更舒服。
内容的提问来源于stack exchange,提问作者Sa Roz
相关产品推荐
相关产品推荐

