Laravel逃离刀片模板中的所有HTML

Dr.*_*Neo 58 php laravel laravel-4 laravel-blade

我正在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用大括号打印内容.

{{ $content->page_desc }}
Run Code Online (Sandbox Code Playgroud)

和三重大括号.

{{{ $content->page_desc }}}
Run Code Online (Sandbox Code Playgroud)

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

Iva*_*cic 135

将语法更改{{ }}{!! !!}.

正如The Alpha在上面的评论中所说(不是答案,所以我认为我会发布),在Laravel 5中,{{ }}(之前未转义的输出语法)已经改为{!! !!}.替换{{ }}{!! !!},它应该工作.


小智 13

使用这个标签{!! 说明文字!!}


Avi*_*mar 7

在{中包含内容!!}.


Meh*_*lık 5

我遇到过同样的问题。感谢您以上的回答,我解决了我的问题。如果有人面临相同的问题,可以通过以下两种方法解决此问题:

  • 您可以使用 {!! $news->body !!}
  • 您可以使用传统的php开放(不推荐),例如: <?php echo $string ?>

希望对您有所帮助。


Mar*_*łek 2

在刀片模板中显示 HTML 代码没有问题。

为了进行测试,您可以仅向 paths.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);
    }
);
Run Code Online (Sandbox Code Playgroud)

并在hello.blade.php文件中:

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

{{ $content->page_desc }}

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

对于以下代码,您将得到如图所示的输出

输出

所以page_desc在你的情况下可能不是你所期望的。但正如您所看到的,如果有人使用例如 '` 标签,那么您可能应该在分配给刀片模板之前在您的路线中过滤一些标签

编辑

我还通过将相同的代码放入数据库来测试它:

Route::get('/', function () {

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

        return View::make('hello')->with('content', $data);
    }
);
Run Code Online (Sandbox Code Playgroud)

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

编辑2

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

public function getPageDescAttribute($value)
{
    return htmlspecialchars($value);
}
Run Code Online (Sandbox Code Playgroud)

然后当你获得page_desc属性时,你将被page_desc修改htmlspecialchars。因此,如果您确定数据库中的数据是原始 html(未转义),您应该查看Pages此类