Laravel 5:ブレードでHTMLを表示する


283

次のように、ビューの1つに文字列が返されます。

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

私はそれをブレードで表示しようとしています:

{{$text}}

ただし、出力はレンダリングされたHTMLではなく生の文字列です。Laravel 5でブレードを使用してHTMLを表示するにはどうすればよいですか?

PS。PHP echo()はHTMLを正しく表示します。


2
{!! nl2br($post->description) !!}スペースとbrしかない場合は、
ムハンマドシャザド

回答:


650

使用する必要があります

{!! $text !!}

を使用すると、文字列は自動的にエスケープされ{{ $text }}ます。


5
ここではこれを言及Laravelのドキュメントは、次のとおりです。「あなたはあなたのデータをエスケープしたくない場合は、次の構文を使用することがあります:Hello, {!! $name !!}.laravel.com/docs/5.5/blade#displaying-data
ライアン

1
@Ryanが言ったことについても疑問に思っています。これはセキュリティの問題ではありませんか?
サンダー

@sanders $textユーザー入力が含まれていて、これを適切にエスケープしなかった場合、セキュリティ上の問題である可能性が非常に高くなります。たとえば、XSSを許可するHTMLを含める$text = 'Hello <b>'.$_GET['name'].'</b>';こと$_GET['name']ができるので危険です。あなたがすることができ$text = 'Hello <b>'.htmlentities($_GET['name']).'</b>';、安全です。
Christopher K.

この線量はすべてのトリックを行うわけではありません!もし私がそのようなものを持っていて<meta cc="grâce à">、それをブレードで見せたいなら、それはこのようになります<meta cc="gr&acirc;ce &agrave;">。だから私のための答えは@Praveen_Dabralの
ブラヒム



18

使ってください

{!! $test !!} 

HTMLの場合のみ、データや文字列などをレンダリングする場合に使用します。

{{ $test }}

これは、ブレードファイルがコンパイルされるときに

{{ $test }} に変換されます <?php echo e($test) ?> ながら、

{!! $test !!} に変換されます <?php echo $test ?>


13

別の方法があります。オブジェクトの目的がhtmlをレンダリングすることである場合\Illuminate\Contracts\Support\Htmlableは、toHtml()メソッド。

次に{{ $someObject }}、このオブジェクトをブレードから次のようにレンダリングできます(注、{!! !!}構文)。

また、htmlプロパティを返す必要があり、それがhtmlになることがわかっている場合は、次の\Illuminate\Support\HtmlStringようなクラスを使用します。

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

そしてそれを次のように使用します {{ $product->getProductDescription() }}ます。

もちろん、ページ上に未加工のHTMLを直接レンダリングするときに責任があります。


11

これを試して。それは私のために働いた。

{{ html_entity_decode($text) }}

Laravel Bladeテンプレートでは、{{}} wil escape html。ビューのコントローラからHTMLを表示する場合は、文字列からHTMLをデコードします。


3
これは正しくありません。回答の上にあります。あなたのやり方で行うことができます。それは、ポーグラマーを混乱させるだけです
ミラド

8

{!! $ text !!} LaravelでのHTMLコードのレンダリング

{!! $text !!}

使用する場合

{{ $text }}

HTMLコードをレンダリングせず、文字列として印刷しません。


5

{!! $text !!}エスケープせずにデータを表示するために使用します。ただし、ユーザーからのデータであり、クリーンアップされていないデータを使用しないでください。



5

あなたはlaravel 5.で多くの方法で行うことができます。

{!! $text !!}

{!! html_entity_decode($text) !!}

エンコードされたタグ(&lt; p&gt; hello world。&lt; / p&gt;)をデータベースに保存すると、上記のコードは機能します...ありがとう!!!
narasimharaosp

4

以下のような条件の場合、最初に使用する3つの方法を使用してそれを行うことができます

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

ブレードで三項演算子を使用するための3番目の適切な方法

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

3番目の方法がブレードで使用される三項演算子に最適であることを願っています。


4

さらに説明を加えると、Blade {{ }}ステートメント内のコードはhtmlspecialchars()、phpが提供する関数に自動的に渡されます。この関数は文字列を受け取り、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 !!}

中括弧は1つだけ使用していることに注意してください。

上記の出力は次のようになります。

こんにちは

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を提供している場合は、好きなように独自のコードを挿入できます。


2

データ使用を回避したい場合

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



1

textarea内でtinymceとマークアップを使用する場合:

{{ htmlspecialchars($text) }}

0

私はそこに行ったことがあり、それは私のせいでした。そして、非常に愚かなもの。

ファイル名の.blade拡張子を忘れた場合、そのファイルはブレードを理解できませんが、phpコードを実行します。あなたは使うべきです

/resources/views/filename.blade.php

の代わりに

/resources/views/filename.php

これが誰かを助けることを願っています



0

Bootstrap Collapseクラスを使用する場合{!! $text !!} 、私にとってはうまくいきませんが、私にとってはうまくいきます{{ html_entity_decode($text) }}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.