~/til/string-replace-interpreta-dollar-na-substituicao

cat string-replace-interpreta-dollar-na-substituicao.mdx

String.replace interpreta $ mesmo quando o padrão é uma string

1 min de leitura

Injetar HTML renderizado com replace pode corromper a saída silenciosamente, porque a string de substituição ainda passa pelo processamento de padrões.

Eu estava injetando HTML pré-renderizado em um template:

template.replace("<!--app-html-->", html);

Funciona na maioria dos casos, e falha de um jeito difícil de rastrear quando o HTML contém certos caracteres.

O detalhe: mesmo quando o padrão é uma string comum, a substituição passa pelo processamento de padrões. Sequências como $&, $1, $` e $' têm significado especial:

"alvo".replace("alvo", "a$&b");
// "aalvob"  -- e nao "a$&b"

Em HTML real isso aparece em lugar nenhum óbvio, até alguém escrever um artigo sobre expressões regulares e $& ir junto no texto. Aí um pedaço do documento simplesmente se duplica ou desaparece.

A correção é usar uma função como substituição, porque o retorno dela é inserido literalmente:

template.replace("<!--app-html-->", () => html);

Vale para qualquer conteúdo que você não controla: HTML renderizado, texto de usuário, JSON serializado. Se o valor vem de fora, use função.

LER~/til/string-replace-interpreta-dollar-na-substituicao.mdxmdx · utf-8topo
cd ../til