【问题标题】:Displaying HTML with Blade shows the HTML code使用 Blade 显示 HTML 显示 HTML 代码
【发布时间】:2017-11-02 03:38:48
【问题描述】:

我有一个字符串返回到我的视图之一,如下所示:

$text = '<p><strong>Lorem</strong> ipsum dolor <img src="images/test.jpg"></p>'

我正在尝试用 Blade 显示它:

{{$text}}

但是,输出是原始字符串而不是呈现的 HTML。如何在 Laravel 中使用 Blade 显示 HTML?

PS。 PHP echo() 正确显示 HTML。

【问题讨论】:

  • 如果我只有空格和 br,{!! nl2br($post-&gt;description) !!} 对我有用。
  • 我刚刚提供的替代方案比使用 {!! !!},这对于第三方 html 来说不是很安全
  • 对于 Laravel 8 工作:{!! html_entity_decode($content_from_db) !!}

标签: php html laravel laravel-blade


【解决方案1】:

{!! !!} 不安全

在这里阅读:https://laravel.com/docs/5.6/blade#displaying-data

你可以试试:

    @php 
     echo $variable; 
    @endphp

【讨论】:

    【解决方案2】:

    当您的数据包含 HTML 标记时,请使用

    {!! $text !!}
    

    当您的数据不包含 HTML 标记时,请使用

    {{ $text }}
    

    【讨论】:

      【解决方案3】:

      默认情况下,Blade {{ }} 语句会通过 PHP 的 htmlspecialchars 函数自动发送,以防止 XSS 攻击。如果您不希望您的数据被转义,您可以使用以下语法:

      根据the doc,您必须执行以下操作才能在 Blade 文件中呈现 html:

      {!! $text !!}
      

      在回显应用程序用户提供的内容时要非常小心。在显示用户提供的数据时,您通常应该使用转义的双花括号语法来防止 XSS 攻击。

      【讨论】:

        【解决方案4】:

        令人难以置信,有几个相同的结果是错误的答案。

        Laravel 将纯 php 代码保存到 Storage/fremework/view 当然,如果你有成千上万的浏览量,要花上一个世纪才能找到你想要的浏览量,但是打开任何一个,看看哪里有 {{ $text }} 现在有&lt;?php echo $text; ?&gt; 然后忘记 {{ $text }} 并使用&lt;?php print($text); ?&gt;,但这仍然不是一个好主意,如果陌生人创建了 html,那么让我们创建我们的条件:

        //Controller 
        <?php
        
         $body = strip_tags($text, '<strong><span><p><b><small><pre><div><br><img><video><a><ul><li><ol><i><font><blockquote>');
        
        return view('myview', compact('body'));
        ?>
        //Blade
        
        <iframe srcdocs="{{print($body)}}" sandbox></iframe>
        
        or
        
        <iframe srcdocs="{{$body}}" sandbox></iframe>
        

        允许的标签

        <strong><span><p><b><small><pre><div><br><img><video><a><ul><li><ol><i><font><blockquote>
        

        是的,您可以在刀片语法中使用一些 php 函数,尽管这没有正确记录并且您也需要小心,因为 {{}} 与 echo 相同,所以如果您放置类似 print() 的内容, print_r 或 var_dump 会起作用,但更复杂的东西不起作用,它实际上并不能取代&lt;?php ?&gt;

        为什么是 iframe?

        注意,这不是普通的iframe,它有sandbox属性,而strip_tags()函数已经去掉了标签,iframe会字面上杀死onclick(),onerro()之类的,隔离代码,但是,一个悲观的人会说他还能用地址栏,其实laravel已经有了转义,不过你可以创建中间件,在app/http/kernel.php的中间件组中列出。因此,您将有机会确保请求的 url 符合条件

        不那么痛苦的选择

        如本文所述:https://kuztek.com/blog/use-laravel-purifier-securit 您可以使用 HTMLPurifier,请按照以下步骤操作

        安装包:

        composer require mews/purifier
        

        生成配置文件:

        php artisan vendor:publish --provider="Mews\Purifier\PurifierServiceProvider" 
        

        在 config/purifier.php 中更改“HTML.Allowed”

        'HTML.Allowed' => 'h1[class],h2[class],h3[class],h4[class],h5[class],div[class],b,strong[style|class],i[class],em,a[href|title|class],ul[style|class],ol[style|class],li[style|class],p[style|class],br,blockquote[class],span[style|class],img[width|height|alt|src|class]',
        

        无需进一步操作,只需在刀片上调用它,将 $body 替换为包含 html 代码的变量

        {{ clean($body) }}
        

        【讨论】:

          【解决方案5】:

          在控制器上。

          $your_variable = '';
          $your_variable .= '<p>Hello world</p>';
          
          return view('viewname')->with('your_variable', $your_variable)
          

          如果您不希望您的数据被转义,您可以使用以下语法:

          {!! $your_variable !!}
          

          输出

          Hello world
          

          【讨论】:

            【解决方案6】:

            为了进一步解释,Blade {{ }} 语句中的代码会自动通过 php 提供的 htmlspecialchars() 函数传递。此函数接受一个字符串,并会查找 HTML 使用的所有保留字符。保留字符为&amp;&amp;lt;&amp;gt;"。然后它将用它们的 HTML 实体变体替换这些保留字符。分别是:

            |---------------------|------------------|
            |      Character      |       Entity     |
            |---------------------|------------------|
            |          &          |       &amp;      |
            |---------------------|------------------|
            |          <          |       &lt;       |
            |---------------------|------------------|
            |          >          |       &gt;       |
            |---------------------|------------------|
            |          "          |       &quot;     |
            |---------------------|------------------|
            

            例如,假设我们有以下 php 语句:

            $hello = "<b>Hello</b>";
            

            {{ $hello }} 的形式传递给刀片将产生您传递的文字字符串:

            <b>Hello</b>
            

            在后台,它实际上会回显为&amp;lt;b&amp;gt;Hello&amp;lt;b&amp;gt

            如果我们想绕过它并将其实际呈现为粗体标记,我们可以通过添加转义语法刀片来转义 htmlspecialchars() 函数:

            {!! $hello !!}

            请注意,我们只使用一个花括号。

            上面的输出将产生:

            你好

            我们还可以利用 php 提供的另一个方便的函数,即html_entity_decode() 函数。这会将 HTML 实体转换为它们尊重的 HTML 字符。把它想象成htmlspecialchars()的反面

            例如说我们有以下 php 语句:

            $hello = "&lt;b&gt; Hello &lt;b&gt;";
            

            我们现在可以将此函数添加到我们的转义刀片语句中:

            {!! html_entity_decode($hello) !!}
            

            这将获取 HTML 实体 &amp;lt; 并将其解析为 HTML 代码 &amp;lt;,而不仅仅是字符串。

            同样适用于大于实体&amp;gt;

            这会产生

            你好

            首先逃避的重点是避免 XSS 攻击。因此在使用转义语法时要非常小心,尤其是如果您的应用程序中的用户自己提供 HTML,他们可以随意注入自己的代码。

            【讨论】:

              【解决方案7】:

              如果你有时使用 Bootstrap Collapse 类 {!! $text !!} 不适合我,但{{ html_entity_decode($text) }} 适合我。

              【讨论】:

                【解决方案8】:

                试试这个,成功了:

                @php 
                   echo $text; 
                @endphp
                

                【讨论】:

                  【解决方案9】:

                  您可以在 laravel 5 中使用多种方式..

                  {!! $text !!}
                  
                  {!! html_entity_decode($text) !!}
                  

                  【讨论】:

                  • 如果您将编码标签 (<p>hello world.</p>) 存储在 db 中,上面的代码可以工作...谢谢!!!
                  【解决方案10】:

                  你需要使用

                  {!! $text !!}
                  

                  使用{{ $text }}时,字符串会自动转义。

                  【讨论】:

                  • 这里是 Laravel 文档中提到这一点:“如果你不希望你的数据被转义,你可以使用以下语法:Hello, {!! $name !!}.laravel.com/docs/5.5/blade#displaying-data
                  • 我也想知道@Ryan 提到了什么。这不是安全问题吗?
                  • @sanders 如果$text 包含用户输入并且您没有正确转义,这很可能是一个安全问题。例如,$text = 'Hello &lt;b&gt;'.$_GET['name'].'&lt;/b&gt;'; 很危险,因为$_GET['name'] 可能包含允许 XSS 的 HTML。你可以这样做 $text = 'Hello &lt;b&gt;'.htmlentities($_GET['name']).'&lt;/b&gt;'; 并且会很安全。
                  • 这并不能完全解决问题!如果我有类似&lt;meta cc="grâce à"&gt; 的东西并且我想在刀片中显示它,它会看起来像这样&lt;meta cc="gr&amp;acirc;ce &amp;agrave;"&gt;。所以我的答案是@Praveen_Dabral 的
                  • 这会打印出 3 次内容(重复),有什么想法吗?
                  【解决方案11】:

                  您可以使用以下三种方式首先使用 if 条件

                  {!! $text !!}
                  

                  第二种方式

                  <td class="nowrap">
                  @if( $order->status == '0' )
                      <button class="btn btn-danger">Inactive</button>
                  @else
                      <button class="btn btn-success">Active</button>
                  @endif
                  </td>
                  

                  在刀片上使用三元运算符的第三种正确方法

                  <td class="nowrap">
                        {!! $order->status=='0' ? 
                            '<button class="btn btn-danger">Inactive</button> : 
                            '<button class="btn btn-success">Active</button> !!}
                  </td>
                  

                  我希望第三种方式非常适合刀片上使用的三元运算符。

                  【讨论】:

                    【解决方案12】:

                    我去过那里,这是我的错。而且非常愚蠢。

                    如果您忘记了文件名中的 .blade 扩展名,则该文件无法理解 Blade,但会运行 php 代码。你应该使用

                    /resources/views/filename.blade.php
                    

                    而不是

                    /resources/views/filename.php
                    

                    希望这对某人有所帮助

                    【讨论】:

                      【解决方案13】:

                      对于在 textarea 中使用 tinymce 和标记的人:

                      {{ htmlspecialchars($text) }}
                      

                      【讨论】:

                        【解决方案14】:

                        这适用于 Laravel 5.6

                        <?php echo "$text"; ?>
                        

                        换一种方式

                        {!! $text !!}
                        

                        它不会呈现 HTML 代码并打印为字符串。

                        更多详情请打开链接:-Display HTML with Blade

                        【讨论】:

                          【解决方案15】:

                          使用{!! $text !!}显示数据而不转义。请确保不要对来自用户且尚未清理的数据执行此操作。

                          【讨论】:

                            【解决方案16】:

                            你可以试试这个:

                            {!! $text !!}
                            

                            你应该看看:http://laravel.com/docs/5.0/upgrade#upgrade-5.0

                            【讨论】:

                              【解决方案17】:

                              请使用

                              {!! $test !!} 
                              

                              仅在 HTML 的情况下,如果您想呈现数据、sting 等,请使用

                              {{ $test }}
                              

                              这是因为当你的刀片文件被编译时

                              {{ $test }} 转换为 &lt;?php echo e($test) ?&gt;

                              {!! $test !!} 转换为&lt;?php echo $test ?&gt;

                              【讨论】:

                                【解决方案18】:

                                对于 laravel 5

                                {!!html_entity_decode($text)!!}
                                

                                通过这个link 弄清楚,请参阅 RachidLaasri 答案

                                【讨论】:

                                • 谢谢..它的工作..{!! html_entity_decode($data) !!}
                                • 对于问题中给出的数据,这提供了与接受的答案完全相同的结果。唯一表现不同的情况是$text 中有 HTML 实体。
                                【解决方案19】:

                                如果你想转义数据使用

                                {{ $html }}
                                

                                如果不想转义数据使用

                                {!! $html !!}
                                

                                但是在 Laravel-4 之前你可以使用

                                {{ HTML::link('/auth/logout', 'Sign Out', array('class' => 'btn btn-default btn-flat')) }}
                                

                                说到 Laravel-5

                                {!! HTML::link('/auth/logout', 'Sign Out', array('class' => 'btn btn-default btn-flat')) !!} 
                                

                                您也可以使用 PHP 函数来做到这一点

                                {{ html_entity_decode($data) }}
                                

                                查看PHP文档获取该函数的参数

                                html_entity_decode - php.net

                                【讨论】:

                                  【解决方案20】:

                                  还有另一种方法。如果对象的目的是呈现 html,您可以实现具有 toHtml() 方法的 \Illuminate\Contracts\Support\Htmlable 合约。

                                  然后您可以像这样从刀片渲染该对象:{{ $someObject }}(注意,不需要{!! !!} 语法)。

                                  另外,如果您想返回 html 属性并且您知道它将是 html,请像这样使用 \Illuminate\Support\HtmlString 类:

                                  public function getProductDescription()
                                  {
                                      return new HtmlString($this->description);
                                  }
                                  

                                  然后像{{ $product-&gt;getProductDescription() }}一样使用它。

                                  在页面上直接渲染原始html时当然要负责。

                                  【讨论】:

                                    【解决方案21】:

                                    试试这个。它对我有用。

                                    {{ html_entity_decode($text) }}
                                    

                                    在 Laravel Blade 模板中,{{ }} 将转义 html。如果要在视图中显示控制器中的 html,请从字符串中解码 html。

                                    【讨论】:

                                    • 这是不对的,上面的答案可以按照你的方式完成,只是让程序员感到困惑
                                    猜你喜欢
                                    • 2011-07-26
                                    • 2017-01-05
                                    • 1970-01-01
                                    • 2014-02-05
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多