Laravel 5: Exibir HTML com Blade

283

Eu tenho uma string retornada para uma das minhas visualizações, assim:

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

Estou tentando exibi-lo com o Blade:

{{$text}}

No entanto, a saída é uma sequência bruta em vez de HTML renderizado. Como exibir HTML com o Blade no Laravel 5?

PS. O PHP echo()exibe o HTML corretamente.

menos açúcar
fonte
2
{!! nl2br($post->description) !!}funciona para mim se eu tiver apenas espaços e br.
Muhammad Shahzad

Respostas:

650

Você precisa usar

{!! $text !!}

A corda escapará automaticamente ao usar {{ $text }}.

terry baixo
fonte
5
Aqui estão os documentos do Laravel que mencionam isso: "Se você não deseja que seus dados sejam escapados, você pode usar a seguinte sintaxe: Hello, {!! $name !!}." laravel.com/docs/5.5/blade#displaying-data
Ryan
1
Também estou pensando sobre o que @Ryan mencionou. Isso não é um problema de segurança?
lixadeiras
@sanders É muito provável que haja um problema de segurança se $textcontiver entrada do usuário e você não tiver escapado adequadamente. Por exemplo, $text = 'Hello <b>'.$_GET['name'].'</b>';é perigoso porque $_GET['name']pode incluir HTML, o que permitiria o XSS. Você poderia fazer $text = 'Hello <b>'.htmlentities($_GET['name']).'</b>';e estaria seguro.
Christopher K.
esta dose não faz todo o truque! se eu tivesse algo parecido <meta cc="grâce à">e quero mostrá-lo na lâmina, ficará assim <meta cc="gr&acirc;ce &agrave;">. Então a resposta para mim é @Praveen_Dabral 's
brahimm 15/08/1918
59

Para laravel 5

{!!html_entity_decode($text)!!}

Descoberto através deste link , consulte a resposta RachidLaasri

Praveen Dabral
fonte
1
Obrigado .. está trabalhando .. {!! html_entity_decode ($ data) !!}
Priyabrata Atha 06/04
18

Por favor, use

{!! $test !!} 

Somente no caso de HTML, se você quiser renderizar dados, picadas etc., use

{{ $test }}

Isso ocorre quando o arquivo blade é compilado

{{ $test }}é convertido em <?php echo e($test) ?> enquanto

{!! $test !!} é convertido para <?php echo $test ?>

Shubham Bansal
fonte
13

Existe outro caminho. Se o objetivo do objeto for renderizar html, você poderá implementar o \Illuminate\Contracts\Support\Htmlablecontrato que possui o toHtml()método

Em seguida, você pode renderizar esse objeto a partir do blade da seguinte maneira: {{ $someObject }}(observe, não há necessidade de {!! !!}sintaxe).

Além disso, se você deseja retornar a propriedade html e sabe que será html, use uma \Illuminate\Support\HtmlStringclasse como esta:

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

e depois use-o como {{ $product->getProductDescription() }}.

Obviamente, seja responsável ao renderizar diretamente o html bruto na página.

Damir Miladinov
fonte
11

Tente isso. Funcionou para mim.

{{ html_entity_decode($text) }}

No modelo Laravel Blade, {{}} escapará do html. Se você deseja exibir o html do controlador à vista, decodifique o html da string.

Mohammed Safeer
fonte
3
isso não está certo é acima de respostas que poderia ser feito em seu caminho apenas confundir o porgrammer
Milad
8

Você pode usar {!! $ text !!} para renderizar código HTML no Laravel

{!! $text !!}

Se você usar

{{ $text }}

Não renderizará código HTML e será impresso como uma sequência.

PPL
fonte
5

Use {!! $text !!}para exibir dados sem escapar. Apenas certifique-se de não fazer isso com os dados que vieram do usuário e não foram limpos.

Patrick Luy
fonte
5

é um simples

{!! $text !!}

laravel compila como um elemento dom e {{$text}}imprime como uma string

Ravindra Bhanderi
fonte
5

você pode fazer de várias maneiras no laravel 5 ..

{!! $text !!}

{!! html_entity_decode($text) !!}
Jignesh Joisar
fonte
se você armazenar tags codificadas (& lt; p & gt; olá mundo. & lt; / p & gt;) no db acima do código funciona ... Obrigado !!!
Narasimharaosp
4

Você pode fazer isso usando três maneiras pela primeira vez, se a condição estiver abaixo

{!! $text !!}

A segunda maneira

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

A terceira e adequada maneira de usar o operador ternário na lâmina

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

Espero que a terceira maneira seja perfeita para o operador ternário usado na lâmina.

Uzair
fonte
4

Para adicionar mais explicações, o código dentro das {{ }}instruções do Blade é passado automaticamente através da htmlspecialchars()função que o php fornece. Essa função usa uma string e encontrará todos os caracteres reservados que o HTML usa. Caracteres reservados são & < >e ". Ele substituirá esses caracteres reservados por sua variante de entidade HTML. Quais são os seguintes:

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

Por exemplo, suponha que tenhamos a seguinte instrução php:

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

Passado para o blade como {{ $hello }}produziria a string literal que você passou:

<b>Hello</b>

Sob o capô, ele realmente ecoaria como &lt;b&gt;Hello&lt;b&gt

Se quiséssemos contornar isso e renderizá-lo como uma marca em negrito, escapamos da htmlspecialchars()função adicionando a sintaxe de escape que o blade fornece:

{!! $hello !!}

Observe que usamos apenas uma chave.

O resultado do exposto acima produziria:

Olá

Também poderíamos utilizar outra função útil que o php fornece, que é a html_entity_decode()função. Isso converterá entidades HTML em seus caracteres HTML respeitados. Pense nisso como o reverso dehtmlspecialchars()

Por exemplo, digamos que temos a seguinte instrução php:

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

Agora poderíamos adicionar esta função à nossa instrução blade de escape:

{!! html_entity_decode($hello) !!}

Isso pegará a entidade HTML &lt;e a analisará como código HTML <, não apenas como uma string.

O mesmo se aplica à entidade maior que &gt;

o que renderia

Olá

O ponto principal de escapar em primeiro lugar é evitar ataques XSS. Portanto, tenha muito cuidado ao usar a sintaxe de escape, especialmente se os usuários do seu aplicativo estiverem fornecendo o HTML eles mesmos, eles poderão injetar seu próprio código como desejarem.

Nathan
fonte
2

Se você quiser escapar dos dados, use

{{ $html }}

Se não quiser escapar dos dados, use

{!! $html !!}

Mas até o Laravel-4 você pode usar

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

Quando chega o Laravel-5

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

Você também pode fazer isso com a função PHP

{{ html_entity_decode($data) }}

analise o documento PHP para obter os parâmetros dessa função

html_entity_decode - php.net

Reiah Paul Sam
fonte
2

Isso funciona bem para o Laravel 5.6

<?php echo "$text"; ?>

De uma maneira diferente

{!! $text !!}

Não renderizará código HTML e será impresso como uma sequência.

Para mais detalhes, acesse o link: - Exibir HTML com Blade

Udhav Sarvaiya
fonte
1

Para quem usa tinymce e marcação na área de texto:

{{ htmlspecialchars($text) }}
Pendurado
fonte
0

Eu estive lá e foi minha culpa. E muito estúpido.

se você esquecer a extensão .blade no nome do arquivo, esse arquivo não entenderá o blade, mas executará o código php. Você deveria usar

/resources/views/filename.blade.php

ao invés de

/resources/views/filename.php

espero que isso ajude alguém

Ali Aydin
fonte
0

Tente isso, já funcionou:

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

Se você usar a classe Bootstrap Collapse, às vezes, {!! $text !!} não funciona para mim, mas {{ html_entity_decode($text) }}funciona para mim.

Rabino Kazi Hassan
fonte