Laravel 5:使用Blade显示HTML

时间:2015-03-25 11:08:33

标签: laravel laravel-5 blade

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

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

我试图用Blade显示它:

{{$text}}

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

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

21 个答案:

答案 0 :(得分:494)

您需要使用

{!! $text !!}

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

答案 1 :(得分:50)

对于laravel 5

XmlConfigurator.Configure

通过此link计算出来,请参阅RachidLaasri回答

答案 2 :(得分:34)

你可以试试这个:

{!! $text !!}

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

答案 3 :(得分:13)

请使用

{!! $test !!} 

仅在HTML的情况下,如果你想渲染数据,刺痛等,请使用

{{ $test }}

这是因为编译刀片文件时

{{ $test }}已转换为<?php echo e($test) ?>

{!! $test !!}已转换为<?php echo $test ?>

答案 4 :(得分:7)

试试这个。它对我有用。

{{ html_entity_decode($text) }}

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

答案 5 :(得分:7)

还有另一种方式。如果对象用于呈现html,则可以实现具有\Illuminate\Contracts\Support\Htmlable方法的toHtml()合同。

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

此外,如果您想要返回html属性并且您知道它将是html,请使用\Illuminate\Support\HtmlString类,如下所示:

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

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

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

答案 6 :(得分:4)

你可以用{!! $ text !!}用于在Laravel中呈现HTML代码

{!! $text !!}

如果您使用

{{ $text }}

它不会呈现HTML代码并以字符串形式打印。

答案 7 :(得分:4)

为进一步说明,刀片{{ }}语句中的代码自动通过php提供的htmlspecialchars()函数传递。该函数接收一个字符串,并将查找HTML使用的所有保留字符。保留字符为& < >"。然后,将这些保留字符替换为其HTML实体变体。以下是:

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

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

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

作为{{ $hello }}传递到刀片服务器将产生您传递的文字字符串:

<b>Hello</b>

在引擎盖下,它实际上会以&lt;b&gt;Hello&lt;b&gt

的形式回显

如果我们想绕过它并实际上将其呈现为粗体标签,我们可以通过添加转义语法刀片提供以下功能来逃避htmlspecialchars()函数:

{!! $hello !!}

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

上面的输出将产生:

你好

我们还可以利用php提供的另一个便捷函数,即html_entity_decode()函数。这会将HTML实体转换为它们受尊重的HTML字符。将其视为htmlspecialchars()

的反义词

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

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

我们现在可以将此功能添加到转义的blade语句中:

{!! html_entity_decode($hello) !!}

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

大于实体&gt;

同样适用

这将产生

你好

逃避的首要目的是避免XSS攻击。因此,在使用转义语法时,请特别小心,尤其是,如果应用程序中的用户自己提供HTML,则可以随意插入自己的代码。

答案 8 :(得分:3)

您可以在laravel 5中使用多种方法。

{!! $text !!}

{!! html_entity_decode($text) !!}

答案 9 :(得分:2)

简单

{
"blogid": 11,
"blog_authorid": 2,
"blog_content": "(this is blog complete content: html encoded on base64 such as) PHNlY3Rpb24+PGRpdiBjbGFzcz0icm93Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tMTIiIGRhdGEtdHlwZT0iY29udGFpbmVyLWNvbnRlbn",
"blog_timestamp": "2018-03-17 00:00:00",
"blog_title": "Amazon India Fashion Week: Autumn-",
"blog_subtitle": "",
"blog_featured_img_link": "link to image",
"blog_intropara": "Introductory para to article",
"blog_status": 1,
"blog_lastupdated": "\"Mar 19, 2018 7:42:23 AM\"",
"blog_type": "Blog",
"blog_tags": "1,4,6",
"blog_uri": "Amazon-India-Fashion-Week-Autumn",
"blog_categories": "1",
"blog_readtime": "5",
"ViewsCount": 0
}

laravel编译为dom元素,{!! $text !!} 打印为字符串

答案 10 :(得分:2)

使用{!! $text !!}显示数据而不转义数据。请确保您不使用来自用户的数据并且尚未清除的数据。

答案 11 :(得分:1)

<块引用>

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

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

{!! $text !!}
<块引用>

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

答案 12 :(得分:1)

You can do that using three ways first use if condition like below

{!! $text !!}

The is Second way

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

The third and proper way for use ternary operator on blade

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

I hope the third way is perfect for used ternary operator on blade.

答案 13 :(得分:1)

这适用于Laravel 5.6

<?php echo "$text"; ?>

以不同的方式

{!! $text !!}

它不会呈现HTML代码并以字符串形式打印。

有关详细信息,请打开链接: - Display HTML with Blade

答案 14 :(得分:1)

如果要转义数据,请使用

{{ $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

答案 15 :(得分:0)

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

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

/resources/views/filename.blade.php

代替

/resources/views/filename.php

希望这对某些人有帮助

答案 16 :(得分:0)

对于在文本区域内使用tinymce和标记的用户:

{{ htmlspecialchars($text) }}

答案 17 :(得分:0)

尝试一下,成功了:

@php 
   echo $text; 
@endphp

答案 18 :(得分:0)

如果您有时使用Bootstrap Collapse类,{!! $text !!}  不是为我工作,而是{{ html_entity_decode($text) }}为我工作。

答案 19 :(得分:0)

在控制器上。

$your_variable = '';
$your_variable .= '<p>Hello world</p>';

return view('viewname')->with('your_variable', $your_variable)

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

{!! $your_variable !!}

输出

Hello world

答案 20 :(得分:0)

难以置信的几个相同的答案,因此都是错误的答案。

Laravel将纯PHP代码保存到Storage / fremework / view 当然,如果您有成千上万的视图,则需要一个世纪的时间才能找到所需的视图,但是打开任何一个视图,都会看到{{$ text}}所在的位置,现在<?php echo $text; ?>然后忘记了{{ $ text}}并使用<?php print($text); ?>,但这仍然不是一个好主意,如果陌生人创建了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函数,尽管没有正确地记录下来,并且您也要小心,因为{{}}与ec​​ho相同,因此如果您放置诸如print()之类的东西,print_r或var_dump可以使用,但是更复杂的功能不起作用,它实际上不能代替<?php ?>

为什么要使用iframe?

请注意,这不是常见的iframe,它具有sandbox属性,而strip_tags()函数已删除了标签,iframe实际上会杀死onclick(),onerro()等,从而隔离代码,但是,一位悲观主义者会说他仍然可以使用地址栏,实际上laravel已经有一个转义符,但是您可以创建中间件并将其列出在app / http / kernel.php的中间件组中。因此,您将有机会确保所请求的网址符合条件

减少痛苦的选择

如本文所述: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) }}