Laravel 5: Wyświetl HTML z Blade


283

Mam ciąg znaków zwrócony do jednego z moich widoków, takiego jak ten:

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

Próbuję wyświetlić go za pomocą Blade:

{{$text}}

Jednak wynikiem wyjściowym jest nieprzetworzony ciąg zamiast renderowanego HTML. Jak wyświetlić HTML za pomocą Blade'a w Laravel 5?

PS. PHP echo()wyświetla poprawnie HTML.


2
{!! nl2br($post->description) !!}działa dla mnie, jeśli mam tylko spacje i br.
Muhammad Shahzad

Odpowiedzi:


651

Musisz użyć

{!! $text !!}

Ciąg automatycznie ucieknie podczas używania {{ $text }}.


5
Oto dokumenty Laravela, które wspominają o tym: „Jeśli nie chcesz, aby twoje dane były usuwane , możesz użyć następującej składni: Hello, {!! $name !!}.laravel.com/docs/5.5/blade#displaying-data
Ryan

1
Zastanawiam się także nad tym, o czym wspomniał @Ryan. Czy to nie jest problem bezpieczeństwa?
szlifierki

@sanders Prawdopodobnie jest to problem z bezpieczeństwem, jeśli $textzawiera dane wejściowe od użytkownika i nie uniknąłeś tego poprawnie. Na przykład $text = 'Hello <b>'.$_GET['name'].'</b>';jest niebezpieczny, ponieważ $_GET['name']może zawierać HTML, który pozwoliłby XSS. Mógłbyś zrobić $text = 'Hello <b>'.htmlentities($_GET['name']).'</b>';i byłby bezpieczny.
Christopher K.

ta dawka nie załatwi całego problemu! gdybym miał coś takiego <meta cc="grâce à">i chcę to pokazać ostrzem, to tak będzie wyglądać <meta cc="gr&acirc;ce &agrave;">. Więc odpowiedź dla mnie to @Praveen_Dabral's
brahimm



18

Proszę użyć

{!! $test !!} 

Tylko w przypadku HTML, jeśli chcesz renderować dane, żądło itp. Użyj

{{ $test }}

Dzieje się tak, ponieważ podczas kompilowania pliku bloku

{{ $test }}jest konwertowany na <?php echo e($test) ?> while

{!! $test !!} jest konwertowany na <?php echo $test ?>


13

Jest inny sposób. Jeśli celem obiektu jest renderowanie HTML, możesz zaimplementować \Illuminate\Contracts\Support\Htmlabletaką umowętoHtml() metodę.

Następnie możesz wyrenderować ten obiekt z bloku w następujący sposób: {{ $someObject }}(uwaga, nie ma takiej potrzeby){!! !!} składni).

Również jeśli chcesz zwrócić właściwość html i wiesz, że będzie to html, użyj \Illuminate\Support\HtmlStringklasy w następujący sposób:

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

a następnie użyj go jak {{ $product->getProductDescription() }} .

Oczywiście ponosisz odpowiedzialność za bezpośrednie renderowanie surowego kodu HTML na stronie.


11

Spróbuj tego. To zadziałało dla mnie.

{{ html_entity_decode($text) }}

W szablonie Laravel Blade {{}} ucieknie HTML. Jeśli chcesz wyświetlić HTML z kontrolera, odkoduj HTML z łańcucha.


3
to nieprawda, powyżej odpowiedzi można to zrobić na swój sposób, po prostu myląc porgrammera
Milad

8

Możesz użyć {!! $ text !!} do renderowania kodu HTML w Laravel

{!! $text !!}

Jeśli użyjesz

{{ $text }}

Nie będzie renderować kodu HTML i drukować jako ciąg.


5

Służy {!! $text !!}do wyświetlania danych bez ucieczki. Tylko upewnij się, że nie robisz tego z danymi, które pochodzą od użytkownika i nie zostały wyczyszczone.



5

możesz zrobić na wiele sposobów w laravel 5 ..

{!! $text !!}

{!! html_entity_decode($text) !!}

jeśli przechowujesz zakodowane tagi (<p> hello world. </ p & gt;) w db powyżej powyższego kodu działa ... Dzięki !!!
narasimharaosp

4

Możesz to zrobić na trzy sposoby, najpierw użyj, jeśli warunek taki jak poniżej

{!! $text !!}

Drugi sposób

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

Trzeci i właściwy sposób użycia trójskładnikowego operatora na ostrzu

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

Mam nadzieję, że trzeci sposób jest idealny dla używanego operatora trójskładnikowego na ostrzu.


4

Aby dodać dalsze wyjaśnienia, kod w {{ }}instrukcjach Blade jest automatycznie przekazywany przez htmlspecialchars()funkcję udostępnianą przez php. Ta funkcja pobiera ciąg znaków i znajdzie wszystkie zastrzeżone znaki, których używa HTML. Znaki zastrzeżone to & < >i ". Następnie zastąpi te zastrzeżone znaki ich wariantem encji HTML. Które są następujące:

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

Załóżmy na przykład, że mamy następującą instrukcję php:

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

Przekazany do ostrza, tak jak {{ $hello }}dałby literalny ciąg znaków, który przekazałeś:

<b>Hello</b>

Pod maską odbija się echem jak &lt;b&gt;Hello&lt;b&gt

Jeśli chcemy to ominąć i wyrenderować jako pogrubiony znacznik, uciekamy od htmlspecialchars()funkcji, dodając blok składni Escape:

{!! $hello !!}

Pamiętaj, że używamy tylko jednego nawiasu klamrowego.

Wynik powyższego przyniósłby:

dzień dobry

Możemy również użyć innej przydatnej funkcji, którą zapewnia php, która jest html_entity_decode()funkcją. Spowoduje to konwersję jednostek HTML na ich respektowane znaki HTML. Pomyśl o tym jak o odwrociehtmlspecialchars()

Na przykład powiedzmy, że mamy następującą instrukcję php:

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

Możemy teraz dodać tę funkcję do naszej instrukcji ucieczki ostrza:

{!! html_entity_decode($hello) !!}

Spowoduje to pobranie encji HTML &lt;i parsowanie jej jako kodu HTML <, a nie tylko ciągu.

To samo będzie miało zastosowanie w przypadku podmiotu większego niż &gt;

który dałby

dzień dobry

Chodzi przede wszystkim o uniknięcie ataków XSS. Dlatego zachowaj ostrożność podczas korzystania ze składni Escape, zwłaszcza jeśli użytkownicy w Twojej aplikacji sami dostarczają kod HTML, mogą wprowadzić własny kod według własnego uznania.


2

Jeśli chcesz uciec od danych, użyj

{{ $html }}

Jeśli nie chcesz uciec przed użyciem danych

{!! $html !!}

Ale do Laravel-4 możesz użyć

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

Jeśli chodzi o Laravel-5

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

Możesz to również zrobić za pomocą funkcji PHP

{{ html_entity_decode($data) }}

przejrzyj dokument PHP, aby uzyskać parametry tej funkcji

html_entity_decode - php.net



1

Dla tych, którzy używają tinymce i znaczników w obszarze tekstowym:

{{ htmlspecialchars($text) }}

0

Byłem tam i to była moja wina. I bardzo głupi.

jeśli zapomnisz rozszerzenia .blade w nazwie pliku, plik ten nie rozumie bloku, ale uruchamia kod php. Powinieneś użyć

/resources/views/filename.blade.php

zamiast

/resources/views/filename.php

mam nadzieję, że to komuś pomoże



0

Jeśli używasz klasy Bootstrap Collapse, czasami {!! $text !!} nie działa to dla mnie, ale {{ html_entity_decode($text) }}działa dla mnie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.