Laravel模板中的HTML转义

80

我正在使用 Laravel 构建一个小型 CMS,尝试显示存储在数据库中的内容,但显示的是 HTML 标签而非执行它们。就好像所有打印数据都自动进行了 html_entity_decode。

<?php

class CmsController extends BaseController
{
    public function Content($name)
    {    
        $data = Pages::where('CID', '=', Config::get('company.CID'))
            ->where('page_name', '=', $name)
            ->first();

        return View::make('cms.page')->with('content', $data);
    }
}

我试图使用花括号打印内容。

{{ $content->page_desc }}

还有三个花括号。

{{{ $content->page_desc }}}

它们给出了相同的结果。我需要执行这些HTML标记而不是转义它们。


1
在最新版本 ver-5.0 中,{{...}}{{{...}}} 都可以实现这个功能,请问您具体使用的是哪个版本? - The Alpha
那我不确定为什么 {{...}} 会给出转义结果! - The Alpha
17
v-5 版本中,使用 {!! !!} 进行普通输出(不进行转义)。 - The Alpha
它们是作为“标签”存储还是已经在数据库中转义?否则我会像The Alpha一样看待它,这只应该出现在Laravel的v5版本中。 - theiNaD
@Dr.Neo 我修改了我的答案,也许能对你有所帮助。 - Marcin Nabiałek
显示剩余3条评论
7个回答

191

将您的语法从{{ }}更改为{!! !!}

正如Alpha在上面的评论中所说(不是答案,所以我想发表),在Laravel 5中,{{ }}(以前是非转义输出语法)已更改为{!! !!}。用{!! !!}替换{{ }},它应该可以工作。


在我的情况下解决了! - fpauer
像魔术一样好用。谢谢!尽管我不知道为什么html_entity_decode没有起作用。 - Always_a_learner
@IvanTopolcic,有没有一种方法可以从@yield('content') Blade指令返回的HTML中提取内容? - CodeConnoisseur
这个文档记录在 https://laravel.com/docs/8.x/blade。 - William Entriken

18

使用此标签{!! 描述文本 !!}


这个答案对我在Laravel 5.2中起作用了。在解决问题的过程中,我还发现如果不使用这种语法:{!! !!},Illuminate/Support/helpers.php::529会运行htmlentities() - PapaHotelPapa
仍然适用于Laravel 7... - Pathros

9

我曾经遇到过同样的问题。感谢以上的答案,我解决了我的问题。如果有其他人也面临相同的问题,这里有两种解决方法:

  • 您可以使用{!! $news->body !!}
  • 您可以使用传统的php打开方式(不建议使用),例如:<?php echo $string ?>

希望这能帮到您。


有没有一种方法可以从 @yield('content') Blade 指令返回的 HTML 中提取内容? - CodeConnoisseur

7
将内容包含在{! <content> !}中。

2
在Blade模板中显示HTML代码没有问题。
作为测试,您可以在routes.php中添加一个路由:
Route::get('/', function () {

        $data = new stdClass();
        $data->page_desc
            = '<strong>aaa</strong><em>bbb</em>
               <p>New paragaph</p><script>alert("Hello");</script>';

        return View::make('hello')->with('content', $data);
    }
);

hello.blade.php 文件中:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>

{{ $content->page_desc }}

</body>
</html>

以下代码的输出结果如下图所示: Output 因此,你的情况中可能page_desc不是你期望的。但是,正如你所看到的,如果有人使用例如'`标签,它可能具有潜在危险性,因此在将其分配给blade模板之前,你应该在路由中过滤一些标签。
编辑:
我还通过将相同的代码放入数据库进行了测试:
Route::get('/', function () {

        $data = User::where('id','=',1)->first();

        return View::make('hello')->with('content', $data);
    }
);

在这种情况下,输出完全相同。

编辑2

我也不知道Pages是你的模型还是供应商模型。例如,它可以内部访问:

public function getPageDescAttribute($value)
{
    return htmlspecialchars($value);
}

当你获取page_desc属性时,你会得到使用htmlspecialchars修改过的page_desc。所以如果你确定数据库中的数据是未转义的原始html,那么你应该查看这个Pages类。


正在测试。谢谢。 - Dr.Neo

1

这在 Laravel 10 中对我有效

{!! $blog->description !!}

这些标签将输出用户输入的数据保存到数据库中。这可能包括任何内容。请考虑通过HTML过滤器或净化器进行处理。 - undefined

-4

{{html_entity_decode ($post->content())}} 在 Laravel 4.0 中为我解决了问题。现在我的 HTML 内容被正确地解释了。


是的,这个解决方案实际上适用于 Laravel 4 - 也许有人知道更好的 L4 解决方案? - Kamil Kiełczewski
1
由于我们正在使用 Laravel,因此应该使用遵循 Laravel 语法的 {!! !!}。 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接