Laravel 5: HTML mit Blade anzeigen


283

Ich habe eine Zeichenfolge zu einer meiner Ansichten wie folgt zurückgegeben:

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

Ich versuche es mit Blade anzuzeigen:

{{$text}}

Die Ausgabe ist jedoch eine Rohzeichenfolge anstelle von gerendertem HTML. Wie zeige ich HTML mit Blade in Laravel 5 an?

PS. PHP echo()zeigt den HTML-Code korrekt an.


2
{!! nl2br($post->description) !!}funktioniert für mich, wenn ich nur Leerzeichen und br habe.
Muhammad Shahzad

Antworten:


650

Sie müssen verwenden

{!! $text !!}

Die Zeichenfolge wird bei Verwendung automatisch maskiert {{ $text }}.


5
Hier sind die Laravel-Dokumente, die dies erwähnen: "Wenn Sie nicht möchten, dass Ihre Daten maskiert werden, können Sie die folgende Syntax verwenden: Hello, {!! $name !!}." laravel.com/docs/5.5/blade#displaying-data
Ryan

1
Ich frage mich auch, was @Ryan erwähnt hat. Ist das nicht ein Sicherheitsproblem?
Sanders

@sanders Es ist sehr wahrscheinlich ein Sicherheitsproblem, wenn es $textBenutzereingaben enthält und Sie dies nicht richtig umgehen konnten . Zum Beispiel $text = 'Hello <b>'.$_GET['name'].'</b>';ist gefährlich, weil $_GET['name']HTML enthalten könnte, das XSS erlauben würde. Sie könnten tun $text = 'Hello <b>'.htmlentities($_GET['name']).'</b>';und wären sicher.
Christopher K.

Diese Dosis macht nicht den ganzen Trick! Wenn ich so etwas hätte <meta cc="grâce à">und es in einer Klinge zeigen möchte, wird es so aussehen <meta cc="gr&acirc;ce &agrave;">. Die Antwort für mich ist also @Praveen_Dabral 's
brahimm



18

Benutzen Sie bitte

{!! $test !!} 

Nur im Falle von HTML, wenn Sie Daten, Stiche usw. rendern möchten

{{ $test }}

Dies liegt daran, dass Ihre Blade-Datei kompiliert wird

{{ $test }}wird in <?php echo e($test) ?> while konvertiert

{!! $test !!} wird konvertiert zu <?php echo $test ?>


13

Es geht auch anders. Wenn das Ziel darin besteht, HTML zu rendern, können Sie einen \Illuminate\Contracts\Support\HtmlableVertrag mit einer toHtml()Methode implementieren .

Dann können Sie das Objekt wie folgt aus dem Blade rendern: {{ $someObject }}(Hinweis, keine {!! !!}Syntax erforderlich ).

Wenn Sie die HTML-Eigenschaft zurückgeben möchten und wissen, dass es sich um HTML handelt, verwenden Sie die folgende \Illuminate\Support\HtmlStringKlasse:

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

und dann benutze es gerne {{ $product->getProductDescription() }}.

Seien Sie natürlich verantwortlich, wenn Sie rohes HTML direkt auf der Seite rendern.


11

Versuche dies. Es hat bei mir funktioniert.

{{ html_entity_decode($text) }}

In der Laravel Blade-Vorlage wird {{}} HTML entkommen. Wenn Sie HTML vom Controller in der Ansicht anzeigen möchten, dekodieren Sie HTML vom String.


3
Dies ist nicht richtig, steht über den Antworten. Es könnte auf Ihre Weise geschehen. Es verwirrt nur den Porgrammer
Milad,

8

Sie können {!! $ text !!} zum Rendern von HTML-Code in Laravel

{!! $text !!}

Wenn du benutzt

{{ $text }}

HTML-Code wird nicht gerendert und als Zeichenfolge gedruckt.


5

Verwenden Sie {!! $text !!}diese Option , um Daten anzuzeigen, ohne sie zu umgehen. Stellen Sie nur sicher, dass Sie dies nicht mit Daten tun, die vom Benutzer stammen und nicht bereinigt wurden.


5

Es ist eine einfache

{!! $text !!}

Laravel kompilieren als Dom-Element und {{$text}}drucken als String


5

Sie können mit vielen Möglichkeiten in Laravel 5 tun ..

{!! $text !!}

{!! html_entity_decode($text) !!}

Wenn Sie verschlüsselte Tags (& lt; p & gt; Hallo Welt. & lt; / p & gt;) in der obigen Datenbank speichern, funktioniert der Code ... Danke !!!
Narasimharaosp

4

Sie können dies auf drei Arten tun, indem Sie zuerst die folgende Bedingung verwenden

{!! $text !!}

Das ist der zweite Weg

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

Der dritte und richtige Weg zur Verwendung des ternären Bedieners auf der Klinge

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

Ich hoffe, der dritte Weg ist perfekt für gebrauchte ternäre Bediener auf Klingen.


4

Um weitere Erklärungen hinzuzufügen, wird Code in Blade- {{ }}Anweisungen automatisch durch die von htmlspecialchars()PHP bereitgestellte Funktion geleitet. Diese Funktion nimmt eine Zeichenfolge auf und findet alle reservierten Zeichen, die HTML verwendet. Reservierte Zeichen sind & < >und ". Diese reservierten Zeichen werden dann durch ihre HTML-Entitätsvariante ersetzt. Welches sind die folgenden:

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

Angenommen, wir haben die folgende PHP-Anweisung:

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

In die Klinge übergeben {{ $hello }}, um die wörtliche Zeichenfolge zu erhalten, die Sie übergeben haben:

<b>Hello</b>

Unter der Haube würde es tatsächlich als widerhallen &lt;b&gt;Hello&lt;b&gt

Wenn wir dies umgehen und es tatsächlich als fettes Tag rendern möchten, können wir die htmlspecialchars()Funktion umgehen, indem wir das Escape-Syntax-Blade hinzufügen, das Folgendes bietet:

{!! $hello !!}

Beachten Sie, dass wir nur eine geschweifte Klammer verwenden.

Die Ausgabe der obigen würde ergeben:

Hallo

Wir könnten auch eine andere praktische Funktion verwenden, die PHP bietet, nämlich die html_entity_decode()Funktion. Dadurch werden HTML-Entitäten in ihre respektierten HTML-Zeichen konvertiert. Betrachten Sie es als das Gegenteil vonhtmlspecialchars()

Nehmen wir zum Beispiel an, wir haben die folgende PHP-Anweisung:

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

Wir könnten diese Funktion jetzt zu unserer Escape-Blade-Anweisung hinzufügen:

{!! html_entity_decode($hello) !!}

Dadurch wird die HTML-Entität &lt;als HTML-Code <und nicht nur als Zeichenfolge analysiert .

Gleiches gilt für die Entität größer als &gt;

was ergeben würde

Hallo

Der springende Punkt bei der Flucht ist zunächst, XSS-Angriffe zu vermeiden. Seien Sie also sehr vorsichtig, wenn Sie die Escape-Syntax verwenden, insbesondere wenn Benutzer in Ihrer Anwendung den HTML-Code selbst bereitstellen, können sie ihren eigenen Code nach Belieben einfügen.


2

Wenn Sie der Datennutzung entgehen möchten

{{ $html }}

Wenn Sie der Datennutzung nicht entkommen möchten

{!! $html !!}

Aber bis Laravel-4 können Sie verwenden

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

Wenn es um Laravel-5 geht

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

Sie können dies auch mit der PHP-Funktion tun

{{ html_entity_decode($data) }}

Im PHP-Dokument finden Sie die Parameter dieser Funktion

html_entity_decode - php.net


2

Dies funktioniert gut für Laravel 5.6

<?php echo "$text"; ?>

Auf andere Weise

{!! $text !!}

HTML-Code wird nicht gerendert und als Zeichenfolge gedruckt.

Für weitere Details öffnen Sie den Link: - Zeigen Sie HTML mit Blade an


1

Für diejenigen, die Tinymce und Markup im Textbereich verwenden:

{{ htmlspecialchars($text) }}

0

Ich war dort und es war meine Schuld. Und sehr dumm.

Wenn Sie die Erweiterung .blade im Dateinamen vergessen, versteht diese Datei Blade nicht, führt jedoch PHP-Code aus. Du solltest benutzen

/resources/views/filename.blade.php

anstatt

/resources/views/filename.php

hoffe das hilft jemandem



0

Wenn Sie die Bootstrap Collapse-Klasse verwenden, {!! $text !!} funktioniert dies manchmal nicht für mich, sondern {{ html_entity_decode($text) }}für mich.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.