Laravel 5:使用Blade显示HTML

les*_*gar 241 laravel blade laravel-5

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

$text = '<p><strong>Lorem</strong> ipsum dolor <img src="images/test.jpg"></p>'
Run Code Online (Sandbox Code Playgroud)

我正试图用Blade显示它:

{{$text}}
Run Code Online (Sandbox Code Playgroud)

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

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

小智 574

你需要使用

{!! $text !!}
Run Code Online (Sandbox Code Playgroud)

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

  • 以下是提到这一点的Laravel文档:"如果您不希望转义数据,可以使用以下语法:`Hello,{!! $ name !!}.""https://laravel.com/文档/ 5.5 /叶片#显示数据 (3认同)
  • 我也想知道@Ryan 提到的内容。这不是安全问题吗? (2认同)

Pra*_*ral 51

对于laravel 5

{!!html_entity_decode($text)!!}
Run Code Online (Sandbox Code Playgroud)

通过此链接计算出来,请参阅RachidLaasri的回答


Ass*_*oob 25

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

{!! $text !!}
Run Code Online (Sandbox Code Playgroud)

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

{{ $text }}
Run Code Online (Sandbox Code Playgroud)


小智 15

请用

{!! $test !!} 
Run Code Online (Sandbox Code Playgroud)

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

{{ $test }}
Run Code Online (Sandbox Code Playgroud)

这是因为编译刀片文件时

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

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


Dam*_*nov 10

还有另一种方式.如果对象的目的是渲染html,你可以实现\Illuminate\Contracts\Support\Htmlable具有toHtml()方法的契约.

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

此外,如果你想返回html属性,你知道它将是html,使用这样的\Illuminate\Support\HtmlString类:

public function getProductDescription()
{
    return new HtmlString($this->description);
}
Run Code Online (Sandbox Code Playgroud)

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

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


Uza*_*air 9

您可以使用三种方式来做到这一点,首先使用 if 条件如下

{!! $text !!}
Run Code Online (Sandbox Code Playgroud)

第二种方式

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

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

<td class="nowrap">
      {!! $order->status=='0' ? 
          '<button class="btn btn-danger">Inactive</button> : 
          '<button class="btn btn-success">Active</button> !!}
</td>
Run Code Online (Sandbox Code Playgroud)

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


Moh*_*eer 8

试试这个.它对我有用.

{{ html_entity_decode($text) }}
Run Code Online (Sandbox Code Playgroud)

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

  • 这是不对的是上面的答案它可以用你的方式完成它只是混淆了porgrammer (3认同)

Jig*_*sar 8

你可以在 Laravel 5 中用很多方法做..

{!! $text !!}

{!! html_entity_decode($text) !!}
Run Code Online (Sandbox Code Playgroud)


小智 7

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


Pie*_*lle 7

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

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

{!! $text !!}
Run Code Online (Sandbox Code Playgroud)

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


PPL*_*PPL 6

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

{!! $text !!}
Run Code Online (Sandbox Code Playgroud)

如果您使用

{{ $text }}
Run Code Online (Sandbox Code Playgroud)

它不会呈现HTML代码,也不会作为字符串打印。


Udh*_*iya 6

这适用于 Laravel 5.6

<?php echo "$text"; ?>
Run Code Online (Sandbox Code Playgroud)

以不同的方式

{!! $text !!}
Run Code Online (Sandbox Code Playgroud)

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

有关更多详细信息,请打开链接:-使用 Blade 显示 HTML


Rei*_*Sam 5

如果你想逃避数据使用

{{ $html }}
Run Code Online (Sandbox Code Playgroud)

如果不想逃避数据使用

{!! $html !!}
Run Code Online (Sandbox Code Playgroud)

但直到 Laravel-4 你可以使用

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

当谈到 Laravel-5 时

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

您也可以使用 PHP 函数来完成此操作

{{ html_entity_decode($data) }}
Run Code Online (Sandbox Code Playgroud)

查阅PHP文档了解该函数的参数

html_entity_decode - php.net


Nat*_*han 5

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

|---------------------|------------------|
|      Character      |       Entity     |
|---------------------|------------------|
|          &          |       &amp;      |
|---------------------|------------------|
|          <          |       &lt;       |
|---------------------|------------------|
|          >          |       &gt;       |
|---------------------|------------------|
|          "          |       &quot;     |
|---------------------|------------------|
Run Code Online (Sandbox Code Playgroud)

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

$hello = "<b>Hello</b>";
Run Code Online (Sandbox Code Playgroud)

传递到刀片中,{{ $hello }}将产生您传递的文字字符串:

<b>Hello</b>
Run Code Online (Sandbox Code Playgroud)

在引擎盖下,它实际上会回响为 &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;";
Run Code Online (Sandbox Code Playgroud)

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

{!! html_entity_decode($hello) !!}
Run Code Online (Sandbox Code Playgroud)

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

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

这会产生

你好

逃避的首要目的是避免 XSS 攻击。所以在使用转义语法时要非常小心,特别是如果你的应用程序中的用户自己提供 HTML,他们可以随意注入自己的代码。