Para adicionar mais explicações, o código dentro das {{ }}
instruções do Blade é passado automaticamente através da htmlspecialchars()
função que o php fornece. Essa função usa uma string e encontrará todos os caracteres reservados que o HTML usa. Caracteres reservados são &
<
>
e "
. Ele substituirá esses caracteres reservados por sua variante de entidade HTML. Quais são os seguintes:
|---------------------|------------------|
| Character | Entity |
|---------------------|------------------|
| & | & |
|---------------------|------------------|
| < | < |
|---------------------|------------------|
| > | > |
|---------------------|------------------|
| " | " |
|---------------------|------------------|
Por exemplo, suponha que tenhamos a seguinte instrução php:
$hello = "<b>Hello</b>";
Passado para o blade como {{ $hello }}
produziria a string literal que você passou:
<b>Hello</b>
Sob o capô, ele realmente ecoaria como <b>Hello<b>
Se quiséssemos contornar isso e renderizá-lo como uma marca em negrito, escapamos da htmlspecialchars()
função adicionando a sintaxe de escape que o blade fornece:
{!! $hello !!}
Observe que usamos apenas uma chave.
O resultado do exposto acima produziria:
Olá
Também poderíamos utilizar outra função útil que o php fornece, que é a html_entity_decode()
função. Isso converterá entidades HTML em seus caracteres HTML respeitados. Pense nisso como o reverso dehtmlspecialchars()
Por exemplo, digamos que temos a seguinte instrução php:
$hello = "<b> Hello <b>";
Agora poderíamos adicionar esta função à nossa instrução blade de escape:
{!! html_entity_decode($hello) !!}
Isso pegará a entidade HTML <
e a analisará como código HTML <
, não apenas como uma string.
O mesmo se aplica à entidade maior que >
o que renderia
Olá
O ponto principal de escapar em primeiro lugar é evitar ataques XSS. Portanto, tenha muito cuidado ao usar a sintaxe de escape, especialmente se os usuários do seu aplicativo estiverem fornecendo o HTML eles mesmos, eles poderão injetar seu próprio código como desejarem.
{!! nl2br($post->description) !!}
funciona para mim se eu tiver apenas espaços e br.