Menu

PHP preg_replace(): substituir com regex e retrorreferências

preg_replace($pattern, $replacement, $subject) substitui cada correspondência de uma expressão regular: preg_replace('/\s+/', ' ', $text) junta os espaços em branco. Veja retrorreferências como $1, preg_replace_callback, como remover caracteres não alfanuméricos, limites e contagens.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

preg_replace($pattern, $replacement, $subject) encontra cada correspondência de uma expressão regular numa string e a substitui. preg_replace('/\s+/', ' ', $text) transforma cada sequência de espaços, tabulações e quebras de linha num único espaço.

A string original não muda; o preg_replace() retorna uma nova. \b marca um limite de palavra, e é por isso que cats fica intacto.

Retrorreferências: 1,1, {1} e \1

Na substituição, $1 representa o que o primeiro grupo de captura encontrou, $2 o segundo, e $0 a correspondência inteira. Use-os para reorganizar o texto encontrado.

Escreva a substituição entre aspas simples. Entre aspas duplas, "\1" vira um escape octal (o byte 0x01) e "${1}" é lido como uma variável chamada 1, que não está definida e usa uma sintaxe de string depreciada desde o PHP 8.2. '\1' entre aspas simples funciona como '$1', mas $1 é a grafia comum.

Remover caracteres não alfanuméricos

Uma classe de caracteres negada, [^...], bate com tudo o que não está listado. Substituí-la por '' remove esses caracteres. Para textos em outros idiomas, use as classes Unicode \p{L} (qualquer letra) e \p{N} (qualquer dígito) com o modificador u, ou você vai remover é, ü e todo caractere japonês.

Gerar um slug de URL

Vários padrões em sequência transformam um título num slug de URL. Primeiro deixe em minúsculas, substitua cada sequência de caracteres não alfanuméricos por um hífen e depois tire os hífens das pontas:

Vários padrões, um limite e uma contagem

$pattern e $replacement podem ser arrays: cada padrão é substituído pela substituição de mesmo índice, em ordem. O quarto argumento limita as substituições por padrão (-1 significa sem limite), e o quinto recebe quantas substituições foram feitas.

Calcular a substituição com preg_replace_callback

Quando a substituição depende da correspondência, use preg_replace_callback(). Ele chama a sua função uma vez por correspondência com o array $matches e insere o que a função retornar. Uma arrow function mantém callbacks curtos numa linha.

O preg_replace_callback_array() recebe um array de pares pattern => callback quando vários padrões precisam cada um da sua função.

Texto de substituição vindo de uma variável

Um $ ou uma barra invertida na substituição tem significado, então uma substituição que vem de um usuário ou do banco de dados pode sair estragada. Um preço de $10 é lido como referência ao grupo 10, que não existe, e sai vazio:

Quando nem o texto buscado nem a substituição são padrões, o str_replace() é a escolha mais simples e mais rápida. Para testar um padrão antes de substituir qualquer coisa, veja o preg_match().

Perguntas frequentes

Como uso retrorreferências no preg_replace?

Refira-se aos grupos de captura como $1, $2 (ou \1) na substituição: preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '$3/$2/$1', '2026-03-14') retorna "14/03/2026". Escreva a substituição entre aspas simples e use ${1} quando um dígito vier logo depois da referência.

Como removo todos os caracteres não alfanuméricos no PHP?

preg_replace('/[^a-zA-Z0-9]/', '', $s) mantém só letras e dígitos ASCII. Para manter letras de qualquer idioma (é, ü, 日本語), use classes Unicode com o modificador u: preg_replace('/[^\p{L}\p{N}]/u', '', $s).

Qual a diferença entre preg_replace e preg_replace_callback?

O preg_replace() recebe uma string de substituição fixa com marcadores $1. O preg_replace_callback() chama uma função para cada correspondência e usa o valor de retorno dela, então você pode calcular a substituição: deixar em maiúsculas, fazer contas ou procurar num array.

Devo usar str_replace ou preg_replace?

Use str_replace() quando substituir um texto fixo: é mais rápido e não precisa de escape. Use preg_replace() quando o texto a substituir segue um padrão, como qualquer sequência de espaços, qualquer dígito ou um limite de palavra.

Como substituo só a primeira correspondência com preg_replace?

Passe um limite como quarto argumento: preg_replace('/\d+/', '#', 'a1 b2 c3', 1) retorna "a# b2 c3". O quinto argumento, passado por referência, recebe o número de substituições feitas.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR