Laravel 5: Відображення HTML за допомогою леза


283

У мене рядок повернувся до одного з моїх поглядів, наприклад, такого:

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

Я намагаюся відобразити його за допомогою Blade:

{{$text}}

Тим не менш, вихід - це необроблений рядок замість виведеного HTML. Як відобразити HTML з Blade в Laravel 5?

PS. PHPecho() відображає 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, якщо ви хочете надавати дані, використовуйте жало тощо

{{ $test }}

Це тому, що коли ваш файл леза компілюється

{{ $test }}перетворюється на <?php echo e($test) ?> час

{!! $test !!} перетворюється в <?php echo $test ?>


13

Є й інший спосіб. Якщо метою об'єкта є надання HTML, ви можете реалізувати \Illuminate\Contracts\Support\Htmlableконтракт, який маєtoHtml() метод.

Тоді ви можете винести цей об’єкт із леза таким чином: {{ $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 & hello world. & lt; / p & gt) у db вище коду працює ... Дякую !!!
narasimharaosp

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()функції, додавши леза синтаксису втечі:

{!! $hello !!}

Зауважте, що ми використовуємо лише одну фігурну дужку.

Вихід з вищезазначеного дасть:

Здравствуйте

Ми також могли б використовувати іншу зручну функцію, яку надає php, а саме цю html_entity_decode()функцію. Це перетворить HTML-об'єкти у їх поважані символи HTML. Подумайте про це як на зворотній бікhtmlspecialchars()

Наприклад, у нас є наступне твердження php:

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

Тепер ми можемо додати цю функцію до нашого втеченого леза:

{!! html_entity_decode($hello) !!}

Це візьме сутність HTML &lt;і розбере його як HTML-код< , а не лише рядок.

Те саме стосуватиметься сутності, що перевищує сутність &gt;

що дало б урожай

Здравствуйте

Вся суть втечі в першу чергу полягає в тому, щоб уникнути атак XSS. Тому будьте дуже обережні при використанні синтаксису втечі, особливо якщо користувачі у вашій програмі надають 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


1

Для тих, хто використовує tinymce та розмітку в textarea:

{{ htmlspecialchars($text) }}

0

Я був там, і це було моєю виною. І дуже дурний.

якщо ви забудете розширення .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.