Laravel为何将侧边栏包裹在em标签中?附布局异常问题
解决Laravel Blade模板渲染后侧边栏被意外嵌套em标签的问题
看起来你遇到的核心问题是Blade模板渲染时意外生成了未在代码中定义的<em>标签,导致Bootstrap的栅格布局被破坏,侧边栏从右侧跑到了内容下方。结合你提供的代码和现象,我来帮你一步步排查解决:
一、问题根源定位
你提到Chrome开发者工具发现侧边栏被嵌套在<em>标签里,而代码中并没有写这个标签,这大概率是Blade模板解析时的语法错误或内容异常导致的HTML渲染混乱——最常见的原因是未转义输出的富文本内容里存在未闭合的HTML标签,打乱了整个页面的结构层级,后续的侧边栏、页脚都会被错误地嵌套进未闭合的标签里。
看你提供的index.blade.php代码,有一处需要重点排查:
<p class="card-text">{!! str_limit($post->body,200,'...')!!}</p>
这里的{!! ... !!}是Laravel的未转义输出指令,如果被删除的那篇文章(或其他文章)的$post->body字段里包含未闭合的HTML标签(比如用户输入的<em>测试内容没写</em>),就会导致浏览器解析HTML时出现结构错乱,把后续的侧边栏、页脚都包裹进这个未闭合的<em>里。
二、分步解决方案
1. 临时验证问题原因
先快速验证是不是富文本内容的问题:
- 把上面的未转义输出临时改成转义输出:
然后测试删除文章后,侧边栏是否恢复正常。如果恢复了,说明就是某篇文章的<p class="card-text">{{ str_limit($post->body,200,'...') }}</p>body字段里有未闭合的HTML标签。
2. 安全处理富文本内容
如果你确实需要保留富文本格式,一定要确保内容的HTML结构完整:
- 可以用
strip_tags()过滤危险标签,只允许安全的HTML标签存在:
上面的代码只保留<p class="card-text">{!! str_limit(strip_tags($post->body, '<p><b><i><u>'),200,'...')!!}</p><p>、<b>、<i>、<u>这些安全标签,其他未闭合的标签都会被过滤,避免破坏页面结构。 - 进阶方案可以引入
HTMLPurifier库,更专业地清理和规范富文本内容,彻底避免未闭合标签的问题。
3. 清除视图缓存(必做)
Laravel会缓存编译后的Blade视图,有时候旧缓存会导致异常渲染,执行以下命令清除视图缓存:
php artisan view:clear
之前你只清除了应用缓存,视图缓存是单独存储的,一定要执行这个命令。
4. 检查模板语法闭合
再快速核对一遍Blade指令和HTML标签的闭合情况:
- 确认
@if、@foreach等指令都有对应的@endif、@endforeach(你的代码里这部分是没问题的,但再核对更稳妥); - 检查页面中的
<div>、<section>等容器标签是否都正确闭合,比如index.blade.php里的.row容器是否有对应的闭合标签。
三、验证流程
- 先执行
php artisan view:clear清除视图缓存; - 临时替换富文本输出为转义输出,测试删除文章后页面布局是否正常;
- 如果布局恢复,再针对性处理文章内容的HTML标签问题,使用
strip_tags()或专业库规范富文本; - 最后恢复富文本输出,再次测试页面布局。
内容的提问来源于stack exchange,提问作者gkennedy87
相关产品推荐
相关产品推荐

