Laravel 5: Mostrar HTML con Blade

283

Tengo una cadena devuelta a una de mis vistas, así:

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

Estoy tratando de mostrarlo con Blade:

{{$text}}

Sin embargo, el resultado es una cadena sin formato en lugar de HTML procesado. ¿Cómo visualizo HTML con Blade en Laravel 5?

PD. PHP echo()muestra el HTML correctamente.

menos azucar
fuente
2
{!! nl2br($post->description) !!}funciona para mí si solo tengo espacios y br.
Muhammad Shahzad

Respuestas:

652

Necesitas usar

{!! $text !!}

La cadena se escapará automáticamente cuando se use {{ $text }}.

Terry bajo
fuente
55
Estos son los documentos de Laravel que mencionan esto: "Si no desea que se escapen sus datos, puede usar la siguiente sintaxis: Hello, {!! $name !!}." laravel.com/docs/5.5/blade#displaying-data
Ryan
1
También me pregunto qué mencionó @Ryan. ¿No es esto un problema de seguridad?
lijadoras
@sanders Es muy probable que sea un problema de seguridad si $textcontiene información del usuario y no escapó de esta manera. Por ejemplo, $text = 'Hello <b>'.$_GET['name'].'</b>';es peligroso porque $_GET['name']podría incluir HTML, lo que permitiría XSS. Podrías hacerlo $text = 'Hello <b>'.htmlentities($_GET['name']).'</b>';y estarías a salvo.
Christopher K.
esta dosis no hace todo el truco! Si tuviera algo así <meta cc="grâce à">y quiero mostrarlo en Blade, se verá así <meta cc="gr&acirc;ce &agrave;">. Entonces la respuesta para mí es @Praveen_Dabral 's
brahimm
59

Para laravel 5

{!!html_entity_decode($text)!!}

A través de este enlace , vea la respuesta de RachidLaasri

Praveen Dabral
fuente
1
Gracias ... está funcionando ... {!! html_entity_decode ($ data) !!}
Priyabrata Atha
18

Por favor use

{!! $test !!} 

Solo en el caso de HTML, mientras que si desea representar datos, picadura, etc. use

{{ $test }}

Esto se debe a que cuando se compila su archivo Blade

{{ $test }}se convierte a <?php echo e($test) ?> while

{!! $test !!} se convierte a <?php echo $test ?>

Shubham Bansal
fuente
13

Hay otra manera Si el objetivo del objeto es renderizar html, puede implementar un \Illuminate\Contracts\Support\Htmlablecontrato que tenga un toHtml()método.

Luego puede renderizar ese objeto desde la hoja de esta manera: {{ $someObject }}(nota, no hay necesidad de {!! !!}sintaxis).

Además, si desea devolver la propiedad html y sabe que será html, use una \Illuminate\Support\HtmlStringclase como esta:

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

y luego úsalo como {{ $product->getProductDescription() }}.

Por supuesto, sea responsable al representar directamente html sin procesar en la página.

Damir Miladinov
fuente
11

Prueba esto. Funcionó para mi.

{{ html_entity_decode($text) }}

En la plantilla Laravel Blade, {{}} escapará html. Si desea mostrar html desde el controlador a la vista, descodifique html desde la cadena.

Mohammed Safeer
fuente
3
esto no está bien, está por encima de las respuestas, se podría hacer a su manera, simplemente confundiendo al programador
Milad
8

Puedes usar {!! $ text !!} para renderizar código HTML en Laravel

{!! $text !!}

Si utiliza

{{ $text }}

No representará el código HTML e imprimirá como una cadena.

PPL
fuente
5

Se usa {!! $text !!}para mostrar datos sin escapar de ellos. Solo asegúrese de no hacer esto con los datos que provienen del usuario y que no se han limpiado.

Patrick Luy
fuente
5

es un simple

{!! $text !!}

compilar laravel como elemento dom e {{$text}}imprimir como una cadena

Ravindra Bhanderi
fuente
5

puedes hacerlo de muchas maneras en laravel 5 ..

{!! $text !!}

{!! html_entity_decode($text) !!}
Jignesh Joisar
fuente
si almacena etiquetas codificadas (& lt; p & gt; hello world. & lt; / p & gt;) en db, el código anterior funciona ... ¡Gracias!
narasimharaosp
4

Puede hacerlo usando tres formas de primer uso si la condición como a continuación

{!! $text !!}

El es la segunda forma

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

La tercera y adecuada forma de usar el operador ternario en la cuchilla

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

Espero que la tercera forma sea perfecta para el operador ternario usado en la cuchilla.

Uzair
fuente
4

Para agregar más explicaciones, el código dentro de las {{ }}declaraciones de Blade se pasa automáticamente a través de la htmlspecialchars()función que proporciona php. Esta función toma una cadena y encontrará todos los caracteres reservados que usa HTML. Los caracteres reservados son & < >y ". Luego reemplazará estos caracteres reservados con su variante de entidad HTML. ¿Cuáles son los siguientes:

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

Por ejemplo, supongamos que tenemos la siguiente declaración php:

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

Pasó a blade como {{ $hello }}produciría la cadena literal que pasó:

<b>Hello</b>

Debajo del capó, en realidad resonaría como &lt;b&gt;Hello&lt;b&gt

Si quisiéramos omitir esto y realmente representarlo como una etiqueta en negrita, escaparemos de la htmlspecialchars()función al agregar la hoja de sintaxis de escape que proporciona:

{!! $hello !!}

Tenga en cuenta que solo usamos una llave rizada.

El resultado de lo anterior produciría:

Hola

También podríamos utilizar otra función útil que proporciona php, que es la html_entity_decode()función. Esto convertirá las entidades HTML en sus respetados caracteres HTML. Piense en ello como el reverso dehtmlspecialchars()

Por ejemplo, digamos que tenemos la siguiente declaración php:

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

Ahora podríamos agregar esta función a nuestra declaración de la hoja de escape:

{!! html_entity_decode($hello) !!}

Esto tomará la entidad HTML &lt;y la analizará como código HTML <, no solo una cadena.

Lo mismo se aplicará con la entidad mayor que &gt;

lo que daría lugar

Hola

El objetivo principal de escapar en primer lugar es evitar los ataques XSS. Por lo tanto, tenga mucho cuidado al usar la sintaxis de escape, especialmente si los usuarios de su aplicación proporcionan el HTML ellos mismos, podrían inyectar su propio código cuando lo deseen.

Nathan
fuente
2

Si quieres escapar del uso de datos

{{ $html }}

Si no quiere escapar del uso de datos

{!! $html !!}

Pero hasta Laravel-4 puedes usar

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

Cuando se trata de Laravel-5

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

También puedes hacer esto con la función PHP

{{ html_entity_decode($data) }}

revise el documento PHP para ver los parámetros de esta función

html_entity_decode - php.net

Reiah Paul Sam
fuente
2

Esto funciona bien para Laravel 5.6

<?php echo "$text"; ?>

De una manera diferente

{!! $text !!}

No representará el código HTML e imprimirá como una cadena.

Para obtener más detalles, abra el enlace: - Mostrar HTML con Blade

Udhav Sarvaiya
fuente
1

Para quienes usan tinymce y marcado en textarea:

{{ htmlspecialchars($text) }}
Colgado
fuente
0

He estado allí y fue mi culpa. Y muy estúpido.

si olvida la extensión .blade en el nombre del archivo, ese archivo no entiende la hoja pero ejecuta el código php. Deberías usar

/resources/views/filename.blade.php

en vez de

/resources/views/filename.php

Espero que esto ayude a alguien

Ali Aydin
fuente
0

Prueba esto, ha funcionado:

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

Si usa la clase Bootstrap Collapse, a veces {!! $text !!} no funciona para mí, pero sí {{ html_entity_decode($text) }}.

Kazi Rabbi Hassan
fuente