【问题标题】:Laravel Escaping All HTML in Blade TemplateLaravel 在 Blade 模板中转义所有 HTML
【发布时间】:2014-11-19 08:31:45
【问题描述】:

我正在 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 标签而不是转义它们。

【问题讨论】:

  • 在最新版本中ver-5.0 {{...}}{{{...}}} 都这样做,你到底有什么版本?
  • 我使用的是 4.2 版
  • 那我不知道为什么{{...}} 给出了转义的结果!
  • v-5中,使用{!! !!}进行正常输出(不带esc)。
  • 它们是存储为“标签”还是已经在数据库中转义?因为否则我会看到它像 The Alpha,这应该只在 laravel 的 v5 中出现

标签: php laravel laravel-4 laravel-blade


【解决方案1】:

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

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

【讨论】:

  • 在我的情况下解决了!
  • 像魔术一样工作。谢谢!!虽然我不知道为什么 html_entity_decode 不起作用。
  • @IvanTopolcic 有没有办法提取从 @yield('content') 刀片指令返回的 html?
【解决方案2】:

使用这个标签{!! description text !!}

【讨论】:

  • 这个答案适用于我在 Laravel 5.2 中。在解决问题的过程中,我还发现 Illuminate/Support/helpers.php::529 运行 htmlentities() 如果您不使用此语法:{!! !!}
【解决方案3】:

我遇到了同样的问题。谢谢楼上的回答,我的问题解决了。如果有人面临同样的问题,这里有两种解决方法:

  • 您可以使用{!! $news-&gt;body !!}
  • 您可以使用传统的php打开(不推荐)如:&lt;?php echo $string ?&gt;

希望对你有帮助。

【讨论】:

  • 有没有办法提取从@yield('content')刀片指令返回的html?
【解决方案4】:

包含{! &lt;content&gt; !}中的内容。

【讨论】:

    【解决方案5】:

    在刀片模板中显示 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>
    

    对于以下代码,您将获得图像上的输出

    因此,在您的情况下,page_desc 可能不是您所期望的。但是正如您所看到的,如果有人使用例如'`标签可能会很危险,因此您可能应该在您的路线中分配给刀片模板过滤器一些标签

    编辑

    我还通过将相同的代码放入数据库对其进行了测试:

    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

    【讨论】:

    • 现在测试谢谢
    【解决方案6】:

    {{html_entity_decode ($post->content())}} 用 Laravel 4.0 为我保存了这个问题。现在我的 HTML 内容被解释为它应该的。

    【讨论】:

    • 是的,这个解决方案实际上适用于 laravel 4 - 也许有人知道 L4 的更好解决方案?
    • 既然我们使用的是 laravel,我们应该使用 {!! !!} 遵循 Laravel 语法。
    猜你喜欢
    • 2019-02-28
    • 1970-01-01
    • 2015-09-12
    • 2016-12-18
    • 2016-09-11
    • 2017-09-10
    • 1970-01-01
    • 2014-06-19
    • 2014-10-04
    相关资源
    最近更新 更多