Laravel 5: Blade ile HTML Göster


283

Benim gibi biri, bu şekilde döndürülen bir dize var:

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

Blade ile göstermeye çalışıyorum:

{{$text}}

Ancak çıktı, oluşturulan HTML yerine ham bir dizedir. Laravel 5'te Blade ile HTML'yi nasıl görüntülerim?

PS. PHP echo()HTML'yi doğru görüntüler.


2
{!! nl2br($post->description) !!}sadece boşlukları ve br varsa benim için çalışır.
Muhammad Shahzad

Yanıtlar:


652

Kullanmalısın

{!! $text !!}

Dize kullanırken otomatik olarak kaçacaktır {{ $text }}.


5
İşte bundan bahseden Laravel belgeleri: "Verilerinizin kaçmasını istemiyorsanız, aşağıdaki sözdizimini kullanabilirsiniz: Hello, {!! $name !!}." laravel.com/docs/5.5/blade#displaying-data
Ryan

1
Ayrıca @Ryan'ın bahsettiklerini merak ediyorum. Bu bir güvenlik sorunu değil mi?
sanders

@sanders $textKullanıcı girdisi içeriyorsa ve bu durumdan düzgün bir şekilde çıkamıyorsanız büyük olasılıkla bir güvenlik sorunudur . Örneğin, XSS'ye izin veren HTML içerebileceğinden $text = 'Hello <b>'.$_GET['name'].'</b>';tehlikelidir $_GET['name']. Yapabilirdin $text = 'Hello <b>'.htmlentities($_GET['name']).'</b>';ve güvende olurdun.
Christopher K.

bu doz tüm hile yapmaz! eğer böyle bir şeyim olsaydı <meta cc="grâce à">ve bıçakta göstermek istersem, şöyle görünecek <meta cc="gr&acirc;ce &agrave;">. Yani benim için cevap @Praveen_Dabral 's
brahimm



18

Lütfen kullan

{!! $test !!} 

Yalnızca HTML durumunda veri, sokma vb.

{{ $test }}

Bunun nedeni blade dosyanızın derlenmesi

{{ $test }}<?php echo e($test) ?> iken dönüştürülür

{!! $test !!} dönüştürüldü <?php echo $test ?>


13

Başka bir yol var. Nesne amacı html oluşturmak \Illuminate\Contracts\Support\Htmlableise toHtml()yöntemi olan sözleşme uygulayabilirsiniz .

Sonra bu nesneyi blade'den şu şekilde oluşturabilirsiniz: {{ $someObject }}(not, {!! !!}sözdizimine gerek yok ).

Ayrıca html özelliğini döndürmek istiyorsanız ve html olacağını biliyorsanız, \Illuminate\Support\HtmlStringböyle bir sınıf kullanın :

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

ve sonra gibi kullanın {{ $product->getProductDescription() }}.

Elbette, doğrudan sayfadaki ham html'yi oluştururken sorumlu olun.


11

Bunu dene. Benim için çalıştı.

{{ html_entity_decode($text) }}

Laravel Blade şablonunda {{}} html'den kaçacak. Görünümde denetleyiciden html görüntülemek istiyorsanız, dtml'deki html kodunun kodunu çözün.


3
bu doğru değil cevaplar yukarıda bu şekilde yapılabilir sadece porgrammer kafa karıştırıcı
Milad

8

Kullanabilirsiniz {!! $ text !!} Laravel'de HTML kodu oluşturmak için

{!! $text !!}

Eğer kullanırsan

{{ $text }}

HTML kodu oluşturmaz ve dize olarak yazdırmaz.


5

{!! $text !!}Verileri kaçmadan görüntülemek için kullanın . Bunu kullanıcıdan gelen ve temizlenmemiş verilerle yapmadığınızdan emin olun.


5

bu basit

{!! $text !!}

laravel dom öğesi olarak derleyin ve {{$text}}dize olarak yazdırın


5

laravel 5'te birçok yolla yapabilirsiniz ..

{!! $text !!}

{!! html_entity_decode($text) !!}

kodlu etiketleri (& lt; p & merhaba dünya. & lt; / p & gt;) saklıyorsanız yukarıdaki kod çalışır db ... Teşekkürler !!!
narasimharaosp

4

Aşağıdaki gibi bir durum varsa ilk kullanımda üç yol kullanarak bunu yapabilirsiniz.

{!! $text !!}

İkinci yol

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

Bıçakta üçlü operatör kullanmanın üçüncü ve uygun yolu

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

Umarım üçüncü yol bıçakta kullanılan üçlü operatör için mükemmeldir.


4

Daha fazla açıklama eklemek için, Blade {{ }}ifadelerinin içindeki kod otomatik olarak htmlspecialchars()php'nin sağladığı işlevden geçirilir . Bu işlev bir dize alır ve HTML'nin kullandığı tüm ayrılmış karakterleri bulur. Ayrılmış karakterler & < >ve ". Daha sonra bu ayrılmış karakterleri HTML varlık varyantlarıyla değiştirir. Aşağıdakiler hangileri:

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

Örneğin, aşağıdaki php ifadesine sahip olduğumuzu varsayalım:

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

Geçtiğiniz {{ $hello }}değişmez dizgeyi vereceği gibi blade'e geçti:

<b>Hello</b>

Kaputun altında, aslında &lt;b&gt;Hello&lt;b&gt

Bunu atlamak ve aslında cesur bir etiket olarak işlemek istersek htmlspecialchars(), kaçış sözdizimi blade'ini ekleyerek işlevden kaçarız:

{!! $hello !!}

Sadece bir kıvırcık ayraç kullandığımızı unutmayın.

Yukarıdakilerin çıktısı:

Merhaba

Ayrıca php tarafından sağlanan başka bir kullanışlı işlevi kullanabilirsiniz, bu html_entity_decode()işlevdir. Bu, HTML varlıklarını saygın HTML karakterlerine dönüştürür. Bunun tersi olarak düşününhtmlspecialchars()

Örneğin, aşağıdaki php deyimimiz olduğunu varsayalım:

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

Şimdi bu işlevi çıkış karakterimiz ifademize ekleyebiliriz:

{!! html_entity_decode($hello) !!}

Bu, HTML varlığını alır &lt;ve onu <bir dize olarak değil, HTML kodu olarak ayrıştırır .

Aynı şey varlıktan daha büyük olanlar için de geçerlidir &gt;

hangi sonuç verir

Merhaba

İlk etapta kaçmanın asıl amacı XSS ​​saldırılarından kaçınmaktır. Bu nedenle, kaçış sözdizimini kullanırken çok dikkatli olun, özellikle uygulamanızdaki kullanıcılar HTML'yi kendileri sağlıyorsa, istedikleri gibi kendi kodlarını da ekleyebilirler.


2

Veri kullanımından kaçmak istiyorsanız

{{ $html }}

Veri kullanımından kaçmak istemiyorsanız

{!! $html !!}

Ama Laravel-4'e kadar kullanabilirsiniz

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

Laravel-5'e gelince

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

Bunu PHP işlevi ile de yapabilirsiniz

{{ html_entity_decode($data) }}

Bu işlevin parametreleri için PHP belgesini inceleyin

html_entity_decode - php.net


2

Bu Laravel 5.6 için iyi çalışıyor

<?php echo "$text"; ?>

Farklı bir şekilde

{!! $text !!}

HTML kodu oluşturmaz ve dize olarak yazdırmaz.

Daha fazla ayrıntı için bağlantıyı açın: - Blade ile HTML görüntüleme


1

Textarea içinde tinymce ve işaretleme kullananlar için:

{{ htmlspecialchars($text) }}

0

Orada bulundum ve bu benim hatamdı. Ve çok aptal olan.

dosya adında .blade uzantısını unutursanız, bu dosya blade'i anlamaz, ancak php kodunu çalıştırır. Kullanmalısın

/resources/views/filename.blade.php

onun yerine

/resources/views/filename.php

umarım bu biraz yardımcı olur



0

Bootstrap Collapse sınıfını kullanırsanız bazen {!! $text !!} benim için çalışmıyor ama benim {{ html_entity_decode($text) }}için çalışıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.