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

如何在Laravel中展示包含HTML代码片段的博客文章

解决Laravel博客正文与HTML代码块同时正确渲染的问题

我太懂你这个两难的痛点了——既要让普通正文段落正常换行展示,又要让代码块里的HTML标签原封不动显示,之前的两种方法确实顾此失彼。咱们一步步拆解解决:

问题根源分析

  • 用{!! nl2br($post->body) !!}时,代码块里的<div>会被浏览器直接解析成HTML元素,而不是作为代码文本展示;
  • 把整个内容套进<pre><code>里,又会让普通正文也变成代码格式,完全失去正常的段落排版。

解决方案:分块处理内容

核心思路是区分正文和代码块,分别针对性处理:对代码块内的HTML进行转义(让浏览器把它当成纯文本),对正文部分保留换行转<br>的逻辑,同时不破坏代码块的结构。

1. 创建自定义辅助函数

在你的Laravel项目里,新建(或修改)app/helpers.php文件,添加以下函数:

function format_post_body($body) {
    // 第一步:转义代码块内的HTML内容
    $codePattern = '/<pre><code class="lang-html">(.*?)<\/code><\/pre>/s';
    $body = preg_replace_callback($codePattern, function($matches) {
        // 把代码里的<、>等HTML字符转义成实体,避免被浏览器解析
        $escapedCode = htmlspecialchars(trim($matches[1]));
        return "<pre><code class='lang-html'>{$escapedCode}</code></pre>";
    }, $body);

    // 第二步:对非代码块的正文应用nl2br处理换行
    $contentParts = preg_split('/(<pre.*?<\/pre>)/s', $body, -1, PREG_SPLIT_DELIM_CAPTURE);
    $formattedContent = '';
    
    foreach ($contentParts as $part) {
        if (str_starts_with($part, '<pre')) {
            // 代码块直接保留原样,不处理换行
            $formattedContent .= $part;
        } else {
            // 正文部分把换行转成<br>,保证段落排版
            $formattedContent .= nl2br($part);
        }
    }

    return $formattedContent;
}

如果之前没注册过辅助文件,记得在composer.json里添加:

"autoload": {
    "files": [
        "app/helpers.php"
    ]
}

然后运行composer dump-autoload让Laravel加载这个文件。

2. 在Blade视图中使用函数

把原来的{!! nl2br($post->body) !!}替换成:

{!! format_post_body($post->body) !!}

3. 确保PrismJS正常高亮

如果你的PrismJS是页面加载时初始化的,动态渲染内容后需要手动触发高亮:

// 页面加载完成后或内容更新后调用
Prism.highlightAll();

这样处理后,普通正文会正常换行展示,代码块里的<div>test</div>会原封不动以代码形式显示,同时PrismJS也能正常识别代码块进行语法高亮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:56:38