ChatGPT解决这个技术问题 Extra ChatGPT

使用 Blade 显示 HTML 显示 HTML 代码

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

$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->description) !!} 对我有用。
我刚刚提供的替代方案比使用 {!! !!},这对于第三方 html 来说不是很安全
对于 Laravel 8 工作:{!! html_entity_decode($content_from_db) !!}

C
Chad

你需要使用

{!! $text !!}

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


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

对于 laravel 5

{!!html_entity_decode($text)!!}

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


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

你可以试试这个:

{!! $text !!}

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


A
Arash Hatami

请用

{!! $test !!} 

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

{{ $test }}

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

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

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


D
Damir Miladinov

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

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

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

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

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

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


M
Mohammed Safeer

尝试这个。它对我有用。

{{ html_entity_decode($text) }}

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


这是不对的,上面的答案可以用你的方式完成,只是让程序员感到困惑
A
Assad Yaqoob

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

{!! $text !!}

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

{{ $text }}

M
M Uzair Qadeer

您可以使用以下三种方式首先使用 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>

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


J
Jignesh Joisar

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

{!! $text !!}

{!! html_entity_decode($text) !!}

如果您将编码标签(<p>hello world.</p>)存储在 db 中,上面的代码工作......谢谢!
P
Patrick Luy

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


U
Udhav Sarvaiya

这适用于 Laravel 5.6

<?php echo "$text"; ?>

以不同的方式

{!! $text !!}

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

欲了解更多详情,请打开链接:- Display HTML with Blade


N
Nathan

为了进一步解释,Blade {{ }} 语句中的代码自动通过 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;";

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

{!! html_entity_decode($hello) !!}

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

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

这将产生

你好

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


P
Pierre Arnissolle

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

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

{!! $text !!}

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


N
Nikolay Kostov

如果你想逃避数据使用

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


U
Udhav Sarvaiya

试试这个,它的工作:

@php 
   echo $text; 
@endphp

D
Daljit Singh

{!! !!} 不安全。

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

你可以试试:

    @php 
     echo $variable; 
    @endphp

是同一个“不安全”的 echo 和 {!!小心使用
H
Hung

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

{{ htmlspecialchars($text) }}

V
Vinay Kaithwas

在控制器上。

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

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

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

{!! $your_variable !!}

输出

Hello world

K
Kazi Rabbi Hassan

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


A
Ali Aydin

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

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

/resources/views/filename.blade.php

代替

/resources/views/filename.php

希望这对某人有所帮助