Laravel Escaping Весь HTML в шаблоне Blade
Я строю небольшую CMS в Laravel, и я пытался показать содержимое (которое хранится в БД). Он показывает теги HTML, а не выполняет их. Это похоже на автоматический html_entity_decode для всех печатных данных.
<?php
class CmsController extends BaseController
{
public function Content($name)
{
$data = Pages::where('CID', '=', Config::get('company.CID'))
->where('page_name', '=', $name)
->first();
return View::make('cms.page')->with('content', $data);
}
}
Я попытался напечатать содержимое с помощью фигурной скобки.
{{ $content->page_desc }}
и тройная фигурная скобка.
{{{ $content->page_desc }}}
И они дают одинаковый результат. Мне нужно выполнить эти HTML-теги, а не экранировать их.
Ответы
Ответ 1
Измените свой синтаксис с {{ }}
на {!! !!}
.
Как сказал Альфа в комментарии выше (не ответ, поэтому я думал, что я опубликую), в Laravel 5, {{ }}
(ранее неэксклюзивный выходной синтаксис) изменился на {!! !!}
. Замените {{ }}
на {!! !!}
, и он должен работать.
Ответ 2
используйте этот тег {!! текст описания!}
Ответ 3
Включить содержимое в {!!}.
Ответ 4
У меня была такая же проблема. Спасибо за ответы выше, я решил свою проблему. Если есть люди, столкнувшиеся с одной и той же проблемой, вот два способа решить эту проблему:
- Вы можете использовать
{!! $news->body !!}
- Вы можете использовать традиционное открывание php (это не рекомендуется), например:
<?php echo $string ?>
Надеюсь, это поможет.
Ответ 5
Нет проблем с отображением HTML-кода в шаблонах клинков.
Для теста вы можете добавить route.php только один маршрут:
Route::get('/', function () {
$data = new stdClass();
$data->page_desc
= '<strong>aaa</strong><em>bbb</em>
<p>New paragaph</p><script>alert("Hello");</script>';
return View::make('hello')->with('content', $data);
}
);
и в hello.blade.php
файле:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
{{ $content->page_desc }}
</body>
</html>
Для следующего кода вы получите вывод как на изображении
![Output]()
Так что, вероятно, page_desc
в вашем случае не то, что вы ожидаете. Но, как вы видите, это может быть потенциально опасно, если кто-то использует, например, "тег", поэтому вы, вероятно, должны быть на своем пути, прежде чем назначать шаблону клинка, фильтровать теги
ИЗМЕНИТЬ
Я также протестировал его, поставив тот же код в базу данных:
Route::get('/', function () {
$data = User::where('id','=',1)->first();
return View::make('hello')->with('content', $data);
}
);
В этом случае вывод будет таким же.
Edit2
Я также не знаю, является ли Pages
вашей моделью или моделью поставщика. Например, он может иметь доступ внутрь:
public function getPageDescAttribute($value)
{
return htmlspecialchars($value);
}
а затем, когда вы получите атрибут page_desc
, вы получите изменение page_desc
с помощью htmlspecialchars
. Поэтому, если вы уверены, что данные в базе данных с raw html (не экранированы), вы должны посмотреть на этот Pages
класс
Ответ 6
{{html_entity_decode ($ post- > content())}} сохранил проблему для меня с Laravel 4.0. Теперь мой HTML-контент интерпретируется так, как должен.