Laravel 5: отображение HTML с помощью Blade


283

У меня есть строка, возвращенная в одно из моих представлений, например:

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

Я пытаюсь показать это с помощью Blade:

{{$text}}

Тем не менее, вывод представляет собой необработанную строку вместо отрисованного HTML. Как мне отобразить HTML с Blade в Laravel 5?

PS. PHP echo()правильно отображает HTML.


2
{!! nl2br($post->description) !!}работает для меня, если у меня есть только пробелы и бр.
Мухаммед Шахзад

Ответы:


652

Вам нужно использовать

{!! $text !!}

Строка будет автоматически экранирована при использовании {{ $text }}.


5
Вот документы Laravel, в которых упоминается это: «Если вы не хотите, чтобы ваши данные были экранированы, вы можете использовать следующий синтаксис: Hello, {!! $name !!}.» laravel.com/docs/5.5/blade#displaying-data
Райан,

1
Мне также интересно, о чем упоминал @Ryan. Разве это не проблема безопасности?
Сандерс

@sanders Скорее всего, это проблема безопасности, если она $textсодержит ввод пользователя, и вы не избежали этого должным образом. Например, $text = 'Hello <b>'.$_GET['name'].'</b>';это опасно, потому что $_GET['name']может включать HTML, который позволит XSS. Вы могли бы сделать $text = 'Hello <b>'.htmlentities($_GET['name']).'</b>';и будет в безопасности.
Кристофер К.

эта доза не сделает весь трюк! если бы у меня было что-то подобное, <meta cc="grâce à">и я хочу показать это лезвием, это будет выглядеть так <meta cc="gr&acirc;ce &agrave;">. Так что ответ для меня - @Praveen_Dabral's
brahimm



18

Пожалуйста, используйте

{!! $test !!} 

Только в случае HTML, в то время как если вы хотите визуализировать данные, используйте sting и т. Д.

{{ $test }}

Это потому, что когда ваш блейд-файл скомпилирован

{{ $test }}преобразуется в <?php echo e($test) ?> то время как

{!! $test !!} преобразуется в <?php echo $test ?>


13

Есть другой способ. Если целью объекта является рендеринг html, вы можете реализовать \Illuminate\Contracts\Support\Htmlableконтракт с toHtml()методом.

Затем вы можете визуализировать этот объект из blade-сервера следующим образом: {{ $someObject }}(обратите внимание, {!! !!}синтаксис не требуется ).

Также, если вы хотите вернуть свойство html и знаете, что это будет html, используйте следующий \Illuminate\Support\HtmlStringкласс:

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

а затем использовать его как {{ $product->getProductDescription() }}.

Конечно, будьте ответственны при непосредственном рендеринге необработанного HTML на странице.


11

Попробуй это. Это сработало для меня.

{{ html_entity_decode($text) }}

В шаблоне Laravel Blade {{}} не будет HTML. Если вы хотите отобразить html из контроллера, расшифруйте html из строки.


3
это не правильно, это выше ответов, это может быть сделано по-вашему, это просто запутывает программиста
Милад

8

Ты можешь использовать {!! $ text !!} для рендеринга HTML-кода в Laravel

{!! $text !!}

Если вы используете

{{ $text }}

Он не будет отображать HTML-код и печатать в виде строки.


5

Используется {!! $text !!}для отображения данных без экранирования. Просто убедитесь, что вы не делаете это с данными, которые пришли от пользователя и не были очищены.



5

Вы можете сделать это многими способами в Laravel 5 ..

{!! $text !!}

{!! html_entity_decode($text) !!}

если вы храните закодированные теги (& lt; p & gt; hello world. & lt; / p & gt;) в базе данных выше, код работает ... Спасибо !!!
Нарасимхараосп

4

Вы можете сделать это, используя три способа: сначала используйте условие, как показано ниже

{!! $text !!}

Второй путь

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

Третий и правильный способ использования троичного оператора на лезвии

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

Я надеюсь, что третий способ идеально подходит для подержанных троичного оператора на лезвии.


4

Чтобы добавить дальнейшие объяснения, код внутри {{ }}операторов Blade автоматически передается через htmlspecialchars()функцию, предоставляемую php. Эта функция принимает строку и находит все зарезервированные символы, которые использует HTML. Зарезервированные символы & < >и ". Затем он заменит эти зарезервированные символы на их вариант сущности HTML. Какие следующие:

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

Например, предположим, что у нас есть следующий оператор php:

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

Передается в лезвие так, {{ $hello }}чтобы получить буквальную строку, которую вы передали:

<b>Hello</b>

Под капотом это будет на самом деле эхо, как &lt;b&gt;Hello&lt;b&gt

Если мы хотели обойти это и фактически отобразить его как жирный тэг, мы экранируем htmlspecialchars()функцию, добавив escape-синтаксис:

{!! $hello !!}

Обратите внимание, что мы используем только одну фигурную скобку.

Выход из вышеперечисленного даст:

Привет

Мы также можем использовать другую удобную функцию, предоставляемую php, которая является html_entity_decode()функцией. Это преобразует сущности HTML в их уважаемые символы HTML. Думайте об этом как об обратномhtmlspecialchars()

Например, скажем, у нас есть следующий оператор php:

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

Теперь мы можем добавить эту функцию к нашему экранированному оператору blade:

{!! html_entity_decode($hello) !!}

Это возьмет HTML-сущность &lt;и проанализирует ее как HTML-код.< , а не просто строку.

То же самое будет применяться к сущности больше, чем &gt;

который даст

Привет

Весь смысл побега в первую очередь состоит в том, чтобы избежать атак XSS. Поэтому будьте очень осторожны при использовании escape-синтаксиса, особенно если пользователи в вашем приложении сами предоставляют HTML, они могут вводить свой собственный код по своему усмотрению.


2

Если вы хотите избежать использования данных

{{ $html }}

Если не хотите избежать использования данных

{!! $html !!}

Но до Laravel-4 вы можете использовать

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

Когда доходит до Laravel-5

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

Вы также можете сделать это с помощью функции PHP

{{ html_entity_decode($data) }}

пройти через документ PHP для параметров этой функции

html_entity_decode - php.net


2

Это отлично работает для Laravel 5.6

<?php echo "$text"; ?>

По-другому

{!! $text !!}

Он не будет отображать HTML-код и печатать в виде строки.

Для более подробной информации откройте ссылку: - Показать HTML с Blade



0

Я был там, и это была моя вина. И очень глупый.

Если вы забыли расширение .blade в имени файла, этот файл не понимает blade-сервер, но запускает php-код. Вы должны использовать

/resources/views/filename.blade.php

вместо того

/resources/views/filename.php

надеюсь, это поможет кому-то



0

Если вы используете класс Bootstrap Collapse, иногда {!! $text !!} он не работает для меня, но {{ html_entity_decode($text) }}работает для меня.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.