Docs›Formulários›Aspas em atributos
Formulários

Aspas em atributos

Como escapar aspas em atributos sem quebrar parser.

Atributos HTML — incluindo os atributos :prop="..." dos componentes mad-* — usam aspas como delimitador. Não existe sequência de escape \" em HTML. Dentro de um atributo delimitado por "...", o primeiro " encontrado termina o valor — qualquer \" que você escrever é interpretado como o caractere \ literal seguido do fim do atributo.

Isso afeta diretamente o MadGridCompiler: quando você escreve :prop="[...]" e o conteúdo da expressão precisa conter aspas duplas, o compilador faz o parse do atributo como HTML puro e recebe o valor já truncado no primeiro " — antes mesmo de a expressão PHP ser avaliada.

Sintoma

<!-- ERRADO: compila para algo como "'in', \," com o resto truncado -->
<mad-pivot-table :filters="[['regiao', 'in', \"('Sul', 'Sudeste')\"]]">

No .bladec compilado aparece algo como:

["filters"=>[['regiao', 'in', \,"pivot_fields"=>[...]]

O parser leu [['regiao', 'in', \ e parou no primeiro ". O resto do array some, e o PHP quebra com ParseError: unexpected token "\", expecting "]".

Solução — &quot;

Use a entidade HTML &quot; em vez de \" para representar aspas duplas dentro de um atributo delimitado por ":

<!-- CERTO -->
<mad-pivot-table :filters="[['regiao', 'in', &quot;('Sul', 'Sudeste')&quot;]]">

Alternativa — trocar o delimitador do atributo

Se preferir aspas duplas no conteúdo, delimite o atributo com aspas simples:

<!-- CERTO -->
<mad-pivot-table :filters='[["regiao", "in", "(\'Sul\', \'Sudeste\')"]]'>

Ou ainda — preferencialmente, para expressões complexas — pré-computar a expressão num bloco @php e passar pela variável:

@php
    $filters = [['regiao', 'in', "('Sul', 'Sudeste')"]];
@endphp
<mad-pivot-table :filters="$filters" ... />

NUNCA fazer

<!-- ERRADO: \" não é escape válido em atributo HTML -->
<mad-pivot-table :filters="[['x', 'in', \"('a')\"]]" />

<!-- ERRADO: dupla camada de escape tentando compensar -->
<mad-pivot-table :filters="[['x', 'in', \\\"('a')\\\"]]" />

<!-- CERTO: &quot; -->
<mad-pivot-table :filters="[['x', 'in', &quot;('a')&quot;]]" />

<!-- CERTO: @php pré-computa a expressão -->
@php $f = [['x', 'in', "('a')"]]; @endphp
<mad-pivot-table :filters="$f" />

Regra geral

Dentro de um atributo HTML/Blade, para incluir literalmente o mesmo caractere usado como delimitador, use a entidade HTML correspondente — nunca uma barra invertida:

DelimitadorIncluir literalmenteEntidade
"...""&quot;
'...''&apos; ou &#39;
qualquer<&lt;
qualquer>&gt;
qualquer&&amp;

Não existe \", \', \n etc. em HTML. Sempre entidades — ou, melhor ainda, pré-computar a expressão num bloco @php e passar por variável, evitando o problema por completo.

Próximos