我有一个字符串返回到我的一个视图,如下所示:
$text = '<p><strong>Lorem</strong> ipsum dolor <img src="images/test.jpg"></p>'
我试图用Blade显示它:
{{$text}}
但是,输出是原始字符串而不是呈现的HTML。如何在Laravel 5中使用Blade显示HTML?
PS。 PHP echo()
正确显示HTML。
答案 0 :(得分:494)
您需要使用
{!! $text !!}
使用{{ $text }}
时,字符串将自动转义。
答案 1 :(得分:50)
答案 2 :(得分:34)
答案 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 |
|---------------------|------------------|
| & | & |
|---------------------|------------------|
| < | < |
|---------------------|------------------|
| > | > |
|---------------------|------------------|
| " | " |
|---------------------|------------------|
例如,假设我们有以下php语句:
$hello = "<b>Hello</b>";
作为{{ $hello }}
传递到刀片服务器将产生您传递的文字字符串:
<b>Hello</b>
在引擎盖下,它实际上会以<b>Hello<b>
如果我们想绕过它并实际上将其呈现为粗体标签,我们可以通过添加转义语法刀片提供以下功能来逃避htmlspecialchars()
函数:
{!! $hello !!}
请注意,我们仅使用一个花括号。
上面的输出将产生:
你好
我们还可以利用php提供的另一个便捷函数,即html_entity_decode()
函数。这会将HTML实体转换为它们受尊重的HTML字符。将其视为htmlspecialchars()
例如说我们有以下php语句:
$hello = "<b> Hello <b>";
我们现在可以将此功能添加到转义的blade语句中:
{!! html_entity_decode($hello) !!}
这将采用HTML实体<
并将其解析为HTML代码<
,而不仅仅是字符串。
大于实体>
这将产生
你好
逃避的首要目的是避免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文档以获取此函数的参数
答案 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函数,尽管没有正确地记录下来,并且您也要小心,因为{{}}与echo相同,因此如果您放置诸如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) }}