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

如何在Laravel创建文章时实现textarea标签内换行的识别与保留

问题原因
  • 你提交的textarea内容中的换行是\n字符,HTML默认会将所有连续空白字符(包括换行、制表符、空格)合并为单个空格,所以直接输出时换行就会消失
  • Laravel 的 {{ }} 输出语法会自动转义HTML标签,如果你提前把换行转为<br>再用{{ }}输出,标签会被转义为纯文本无法生效
解决方案

下面是三种常用的安全解决方法,你可以根据场景选择:

方法1:使用nl2br函数(最简单)

先通过Laravel自带的e()函数转义用户输入避免XSS风险,再用nl2br把换行转为<br>标签,最后用非转义语法输出:

{!! nl2br(e($post->body)) !!}

这种方法适合短内容、评论类场景,会把所有换行都转为换行标签

方法2:用<pre>标签包裹输出

<pre>标签默认会保留文本内的所有换行、空格格式,直接用转义语法输出即可,安全性最高:

<pre style="white-space: pre-wrap; word-wrap: break-word; font-family: inherit;">{{ $post->body }}</pre>

这里加的CSS是为了取消pre默认的等宽字体、自动换行避免横向滚动条,适合代码块、需要严格保留输入格式的场景

方法3:转成语义化段落标签(适合文章内容)

如果需要把连续两个换行分隔的内容转为独立的<p>段落,你可以自定义一个辅助函数处理:
首先在app/helpers.php(如果没有就新建,记得在composer.json里引入自动加载)里定义:

if (! function_exists('format_article_body')) {
    function format_article_body(string $body): string
    {
        // 按两个及以上换行拆分段落
        $paragraphs = preg_split('/\R{2,}/', trim($body));
        // 每个段落转义后包裹p标签
        $paragraphs = array_map(fn ($p) => '<p>' . e($p) . '</p>', $paragraphs);
        return implode('', $paragraphs);
    }
}

然后在Blade模板里输出:

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

这种方法生成的HTML语义化最好,适合正式的文章、博客内容展示

注意事项
  • 不要在存储到数据库前提前转HTML内容,所有格式转换都应该在输出到前端时处理,方便后续修改格式规则
  • 禁止直接使用{!! $post->body !!}输出未转义的用户输入,会导致XSS注入漏洞

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:15:02