Laravel 5: Tampilkan HTML dengan Blade

283

Saya memiliki string yang dikembalikan ke salah satu pandangan saya, seperti ini:

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

Saya mencoba menampilkannya dengan Blade:

{{$text}}

Namun, outputnya adalah string mentah dan bukan HTML yang diberikan. Bagaimana cara menampilkan HTML dengan Blade di Laravel 5?

PS. PHP echo()menampilkan HTML dengan benar.

lesssugar
sumber
2
{!! nl2br($post->description) !!}bekerja untuk saya jika saya hanya punya spasi dan br.
Muhammad Shahzad

Jawaban:

652

Anda harus menggunakan

{!! $text !!}

Tali akan otomatis keluar saat menggunakan {{ $text }}.

terry rendah
sumber
5
Berikut adalah dokumen Laravel yang menyebutkan ini: "Jika Anda tidak ingin data Anda melarikan diri, Anda dapat menggunakan sintaks berikut: Hello, {!! $name !!}." laravel.com/docs/5.5/blade#displaying-data
Ryan
1
Saya juga bertanya-tanya tentang apa yang disebutkan @Ryan. Apakah ini bukan masalah keamanan?
sanders
@sanders Kemungkinan besar adalah masalah keamanan jika $textberisi input pengguna dan Anda tidak lolos dengan benar. Misalnya, $text = 'Hello <b>'.$_GET['name'].'</b>';berbahaya karena $_GET['name']bisa menyertakan HTML, yang akan memungkinkan XSS. Anda bisa melakukannya $text = 'Hello <b>'.htmlentities($_GET['name']).'</b>';dan akan aman.
Christopher K.
dosis ini tidak melakukan seluruh trik! Jika saya memiliki sesuatu seperti <meta cc="grâce à">dan saya ingin menunjukkannya di blade, Ini akan terlihat seperti ini <meta cc="gr&acirc;ce &agrave;">. Jadi jawaban untuk saya adalah @Praveen_Dabral 's
brahimm
59

Untuk laravel 5

{!!html_entity_decode($text)!!}

Mencari tahu melalui tautan ini , lihat jawaban RachidLaasri

Praveen Dabral
sumber
1
Terima kasih..sudah berfungsi .. {!! html_entity_decode ($ data) !!}
Priyabrata Atha
18

Mohon gunakan

{!! $test !!} 

Hanya dalam kasus HTML sementara jika Anda ingin membuat data, sengatan dll. Gunakan

{{ $test }}

Ini karena ketika file blade Anda dikompilasi

{{ $test }}dikonversi menjadi <?php echo e($test) ?> sementara

{!! $test !!} dikonversi menjadi <?php echo $test ?>

Shubham Bansal
sumber
13

Ada cara lain. Jika tujuan objek adalah untuk merender html Anda dapat menerapkan \Illuminate\Contracts\Support\Htmlablekontrak yang telahtoHtml() metode.

Kemudian Anda dapat merender objek itu dari blade seperti ini: {{ $someObject }}(perhatikan, tidak perlu{!! !!} sintaks).

Juga jika Anda ingin mengembalikan properti html dan Anda tahu itu html, gunakan \Illuminate\Support\HtmlStringkelas seperti ini:

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

dan kemudian gunakan seperti {{ $product->getProductDescription() }} .

Tentu saja bertanggung jawab ketika langsung memberikan html mentah pada halaman.

Damir Miladinov
sumber
11

Coba ini. Ini berhasil untuk saya.

{{ html_entity_decode($text) }}

Dalam templat Laravel Blade, {{}} akan lepas html. Jika Anda ingin menampilkan html dari controller dalam pandangan, decode html dari string.

Mohammed Safeer
sumber
3
ini tidak benar adalah jawaban di atas itu bisa dilakukan dengan cara Anda itu hanya membingungkan porgrammer
Milad
8

Kamu bisa memakai {!! $ text !!} untuk merender kode HTML di Laravel

{!! $text !!}

Jika Anda menggunakan

{{ $text }}

Itu tidak akan membuat kode HTML dan mencetak sebagai string.

PPL
sumber
5

Gunakan {!! $text !!}untuk menampilkan data tanpa menghindarinya. Pastikan Anda tidak melakukan ini dengan data yang berasal dari pengguna dan belum dibersihkan.

Patrick Luy
sumber
5

ini sederhana

{!! $text !!}

kompilasi laravel sebagai elemen dom dan {{$text}}cetak sebagai string

Ravindra Bhanderi
sumber
5

Anda dapat melakukannya dengan banyak cara di laravel 5 ..

{!! $text !!}

{!! html_entity_decode($text) !!}
Jignesh Joisar
sumber
jika Anda menyimpan tag yang disandikan (& lt; p & gt; hello world. & lt; / p & gt;) di db kode di atas berfungsi ... Terima kasih !!!
narasimharaosp
4

Anda dapat melakukannya menggunakan tiga cara penggunaan pertama jika kondisi seperti di bawah ini

{!! $text !!}

Ini adalah cara kedua

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

Cara ketiga dan tepat untuk menggunakan operator ternary pada blade

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

Saya harap cara ketiga sempurna untuk operator ternary bekas pada blade.

Uzair
sumber
4

Untuk menambahkan penjelasan lebih lanjut, kode di dalam {{ }}pernyataan Blade secara otomatis melewati htmlspecialchars()fungsi yang disediakan php. Fungsi ini mengambil string dan akan menemukan semua karakter khusus yang digunakan HTML. Karakter yang dilindungi adalah & < >dan ". Kemudian akan menggantikan karakter yang dipesan ini dengan varian entitas HTML mereka. Yang berikut ini:

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

Misalnya, anggap kita memiliki pernyataan php berikut:

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

Dimasukkan ke dalam blade karena {{ $hello }}akan menghasilkan string literal yang Anda berikan:

<b>Hello</b>

Di bawah tenda, itu akan benar-benar bergema &lt;b&gt;Hello&lt;b&gt

Jika kita ingin mem-bypass ini dan benar-benar merendernya sebagai tag tebal, kita keluar dari htmlspecialchars()fungsinya dengan menambahkan blade sintaks escape yang menyediakan:

{!! $hello !!}

Perhatikan bahwa kami hanya menggunakan satu kurung kurawal.

Output di atas akan menghasilkan:

Halo

Kita juga bisa memanfaatkan fungsi praktis lain yang disediakan oleh php, yaitu html_entity_decode()fungsinya. Ini akan mengonversi entitas HTML ke karakter HTML yang disegani. Anggap saja sebagai kebalikan darihtmlspecialchars()

Misalnya katakanlah kita memiliki pernyataan php berikut:

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

Kami sekarang dapat menambahkan fungsi ini ke pernyataan blade kami yang diloloskan:

{!! html_entity_decode($hello) !!}

Ini akan mengambil entitas HTML &lt;dan menguraikannya sebagai kode HTML <, bukan hanya string.

Hal yang sama akan berlaku dengan entitas yang lebih besar dari &gt;

yang akan menghasilkan

Halo

Inti dari melarikan diri di tempat pertama adalah untuk menghindari serangan XSS. Jadi berhati-hatilah saat menggunakan sintaks escape, terutama jika pengguna dalam aplikasi Anda menyediakan HTML sendiri, mereka dapat menyuntikkan kode mereka sendiri sesuka mereka.

Nathan
sumber
2

Jika Anda ingin melarikan diri dari penggunaan data

{{ $html }}

Jika tidak ingin lepas dari penggunaan data

{!! $html !!}

Namun hingga Laravel-4 bisa Anda gunakan

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

Ketika datang ke Laravel-5

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

Anda juga dapat melakukan ini dengan fungsi PHP

{{ html_entity_decode($data) }}

buka dokumen PHP untuk parameter fungsi ini

html_entity_decode - php.net

Reiah Paul Sam
sumber
2

Ini berfungsi dengan baik untuk Laravel 5.6

<?php echo "$text"; ?>

Dengan cara yang berbeda

{!! $text !!}

Itu tidak akan membuat kode HTML dan mencetak sebagai string.

Untuk lebih jelasnya buka tautan: - Tampilkan HTML dengan Blade

Udhav Sarvaiya
sumber
1

Untuk yang menggunakan tinymce dan markup di dalam textarea:

{{ htmlspecialchars($text) }}
Hung
sumber
0

Saya pernah ke sana dan itu salah saya. Dan yang sangat bodoh.

jika Anda lupa ekstensi .blade pada nama file, file itu tidak mengerti blade tetapi menjalankan kode php. Kamu harus menggunakan

/resources/views/filename.blade.php

dari pada

/resources/views/filename.php

Semoga ini bisa membantu seseorang

Ali Aydin
sumber
0

Coba ini, Ini berhasil:

@php 
   echo $text; 
@endphp
ShuBham GuPta
sumber
0

Jika Anda menggunakan kelas Bootstrap Collapse terkadang {!! $text !!} tidak berfungsi untuk saya tetapi {{ html_entity_decode($text) }}berhasil untuk saya.

Kazi Rabbi Hassan
sumber