Laravel 5: visualizza HTML con Blade


283

Ho una stringa restituita a una delle mie visualizzazioni, in questo modo:

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

Sto cercando di visualizzarlo con Blade:

{{$text}}

Tuttavia, l'output è una stringa non elaborata anziché HTML renderizzato. Come visualizzo HTML con Blade in Laravel 5?

PS. PHP echo()visualizza correttamente l'HTML.


2
{!! nl2br($post->description) !!}funziona per me se ho solo spazi e fratelli.
Muhammad Shahzad,

Risposte:


652

Devi usare

{!! $text !!}

La stringa uscirà automaticamente durante l'utilizzo {{ $text }}.


5
Ecco i documenti di Laravel che menzionano questo: "Se non vuoi che i tuoi dati vengano salvati , puoi usare la sintassi seguente: Hello, {!! $name !!}." laravel.com/docs/5.5/blade#displaying-data
Ryan

1
Mi chiedo anche cosa ha detto @Ryan. Non è un problema di sicurezza?
levigatrici

@sanders È molto probabile che sia un problema di sicurezza se $textcontiene input dell'utente e non sei riuscito a sfuggire correttamente. Ad esempio, $text = 'Hello <b>'.$_GET['name'].'</b>';è pericoloso perché $_GET['name']potrebbe includere HTML, che consentirebbe XSS. Si potrebbe fare $text = 'Hello <b>'.htmlentities($_GET['name']).'</b>';e sarebbe al sicuro.
Christopher K.

questa dose non fa tutto il trucco! se avessi qualcosa del genere <meta cc="grâce à">e volessi mostrarlo nella lama, sembrerà così <meta cc="gr&acirc;ce &agrave;">. Quindi la risposta per me è @Praveen_Dabral 's
brahimm,

59

Per laravel 5

{!!html_entity_decode($text)!!}

Capito attraverso questo link , vedi la risposta di RachidLasasri


1
Grazie..è funzionante .. {!! html_entity_decode ($ data) !!}
Priyabrata Atha


18

Si prega di utilizzare

{!! $test !!} 

Solo nel caso di HTML mentre si desidera eseguire il rendering dei dati, utilizzare pungiglione ecc

{{ $test }}

Questo perché quando viene compilato il file blade

{{ $test }}viene convertito in <?php echo e($test) ?> while

{!! $test !!} viene convertito in <?php echo $test ?>


13

C'è un altro modo. Se lo scopo dell'oggetto è il rendering di HTML, è possibile implementare un \Illuminate\Contracts\Support\Htmlablecontratto con toHtml()metodo.

Quindi puoi renderizzare l'oggetto dal pannello in questo modo: {{ $someObject }}(nota, non c'è bisogno di {!! !!}sintassi).

Inoltre, se vuoi restituire la proprietà html e sai che sarà html, usa la \Illuminate\Support\HtmlStringclasse in questo modo:

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

e poi usalo come {{ $product->getProductDescription() }}.

Ovviamente sii responsabile quando esegui il rendering diretto di HTML grezzo sulla pagina.


11

Prova questo. Ha funzionato per me.

{{ html_entity_decode($text) }}

Nel modello di Laravel Blade, {{}} wil escape html. Se si desidera visualizzare HTML dal controller in vista, decodificare HTML dalla stringa.


3
questo non è giusto è sopra le risposte che potrebbe essere fatto a modo tuo semplicemente confondendo il porgrammer
Milad,

8

Puoi usare {!! $ text !!} per il rendering del codice HTML in Laravel

{!! $text !!}

Se usi

{{ $text }}

Non eseguirà il rendering del codice HTML e non verrà stampato come stringa.


5

Utilizzare {!! $text !!}per visualizzare i dati senza sfuggirli. Assicurati solo di non farlo con i dati provenienti dall'utente e che non sono stati puliti.


5

è un semplice

{!! $text !!}

laravel viene compilato come elemento dom e {{$text}}stampato come stringa


5

puoi farlo in molti modi in laravel 5 ..

{!! $text !!}

{!! html_entity_decode($text) !!}

se memorizzi tag codificati (& lt; p & gt; hello world. & lt; / p & gt;) in db sopra il codice funziona ... Grazie !!!
narasimharaosp,

4

Puoi farlo usando tre modi prima di usare se condizione come di seguito

{!! $text !!}

È il secondo modo

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

Il terzo e corretto modo per utilizzare l'operatore ternario sulla lama

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

Spero che il terzo modo sia perfetto per l'operatore ternario usato sulla lama.


4

Per aggiungere ulteriori spiegazioni, il codice all'interno delle {{ }}istruzioni Blade viene automaticamente passato attraverso la htmlspecialchars()funzione fornita da php. Questa funzione accetta una stringa e troverà tutti i caratteri riservati utilizzati da HTML. I caratteri riservati sono & < >e ". Sostituirà quindi questi caratteri riservati con la loro variante di entità HTML. Quali sono i seguenti:

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

Ad esempio, supponiamo di avere la seguente istruzione php:

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

Passato alla lama in quanto {{ $hello }}produrrebbe la stringa letterale che hai passato:

<b>Hello</b>

Sotto il cofano, in realtà echeggerebbe come &lt;b&gt;Hello&lt;b&gt

Se volessimo ignorarlo e renderlo effettivamente un tag in grassetto, sfuggiamo alla htmlspecialchars()funzione aggiungendo il pannello della sintassi di escape che fornisce:

{!! $hello !!}

Si noti che usiamo solo una parentesi graffa.

L'output di quanto sopra produrrebbe:

Ciao

Potremmo anche utilizzare un'altra utile funzione fornita da PHP, che è la html_entity_decode()funzione. Ciò convertirà le entità HTML nei loro caratteri HTML rispettati. Pensalo come il contrario dihtmlspecialchars()

Ad esempio diciamo che abbiamo la seguente dichiarazione php:

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

Ora possiamo aggiungere questa funzione alla nostra istruzione blade con escape:

{!! html_entity_decode($hello) !!}

Questo prenderà l'entità HTML &lt;e la analizzerà come codice HTML <, non solo una stringa.

Lo stesso si applicherà con l'entità maggiore di &gt;

che cederebbe

Ciao

Il punto fondamentale di scappare è innanzitutto evitare gli attacchi XSS. Quindi fai molta attenzione quando usi la sintassi di escape, specialmente se gli utenti nella tua applicazione stanno fornendo loro stessi l'HTML, potrebbero iniettare il loro codice a loro piacimento.


2

Se si desidera sfuggire all'utilizzo dei dati

{{ $html }}

Se non vuoi sfuggire all'utilizzo dei dati

{!! $html !!}

Ma fino a Laravel-4 puoi usare

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

Quando arriva il Laravel-5

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

Puoi anche farlo con la funzione PHP

{{ html_entity_decode($data) }}

passare attraverso il documento PHP per i parametri di questa funzione

html_entity_decode - php.net


2

Funziona bene con Laravel 5.6

<?php echo "$text"; ?>

In un altro modo

{!! $text !!}

Non eseguirà il rendering del codice HTML e non verrà stampato come stringa.

Per maggiori dettagli apri il link: - Visualizza HTML con Blade


1

Per chi utilizza tinymce e markup all'interno di textarea:

{{ htmlspecialchars($text) }}

0

Ci sono stato ed è stata colpa mia. E molto stupido.

se dimentichi l'estensione .blade nel nome del file, quel file non capisce il blade ma esegue il codice php. Dovresti usare

/resources/views/filename.blade.php

invece di

/resources/views/filename.php

spero che questo aiuti qualcuno



0

Se usi la classe Collast Bootstrap a volte {!! $text !!} non funziona per me ma {{ html_entity_decode($text) }}funziona per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.