W3docs

Expressões Regulares em PHP

Aprenda a usar expressões regulares em PHP com as funções preg_ para validar entradas, extrair dados e substituir texto.

Uma expressão regular (regex) é um padrão que descreve um conjunto de strings. Em vez de procurar por um texto fixo, você descreve a sua forma — "um endereço de e-mail", "uma sequência de dígitos", "uma palavra terminada em .php" — e o PHP encontra, valida, substitui ou divide textos que correspondem ao padrão.

Este capítulo aborda como as funções preg_ do PHP funcionam, a sintaxe de um padrão (delimitadores, classes de caracteres, quantificadores, grupos, âncoras) e as tarefas práticas mais comuns: validar entradas, extrair dados e substituir texto.

O que são expressões regulares

Uma expressão regular é uma sequência de caracteres que define um padrão de busca. A maioria dos caracteres corresponde a si mesma — o padrão cat corresponde ao texto literal cat. O poder vem dos metacaracteres que representam categorias de caracteres ou repetição:

TokenSignificadoExemplo de correspondência
.Qualquer caractere único (exceto nova linha)c.tcat, cut
\dUm dígito 0-9\d\d42
\wUm caractere "word" (a-z, A-Z, 0-9, _)\w+hello_1
\sEspaço em branco (espaço, tabulação, nova linha)
[abc]Qualquer um de a, b, c[aeiou]e
[^abc]Qualquer caractere exceto a, b, c
a*Zero ou mais a"", aaa
a+Um ou mais aa, aaa
a?Zero ou um a (opcional)"", a
a{2,4}Entre 2 e 4 de aaa, aaaa
^ / $Início / fim da string
|Alternância ("ou")cat|dogcat ou dog
()Agrupamento / captura(ab)+abab

Como as expressões regulares funcionam em PHP

PHP usa PCRE (Perl-Compatible Regular Expressions) através da família de funções preg_. As que você mais utilizará:

FunçãoO que faz
preg_match()Testa se um padrão corresponde; captura a primeira correspondência
preg_match_all()Encontra todas as correspondências em uma string
preg_replace()Substitui cada correspondência por novo texto
preg_split()Divide uma string com base em um padrão
preg_quote()Escapa metacaracteres de regex em uma string literal

A sintaxe de um padrão PHP

Um padrão PHP é uma string composta por três partes: um delimitador, o padrão e modificadores opcionais.

/pattern/modifiers

O primeiro caractere é o delimitador — quase sempre /, mas qualquer caractere não alfanumérico funciona (#, ~, !). Escolher um delimitador que não aparece no seu padrão evita a necessidade de escapar. Por exemplo, ao corresponder a um caminho de URL é mais limpo usar #:

"#^/users/\d+$#"   // no need to escape the slashes

modifiers são letras opcionais após o delimitador de fechamento que alteram o comportamento do mecanismo:

  • i — sem distinção de maiúsculas/minúsculas: /php/i corresponde a PHP, Php, php.
  • mmultimodo: ^ e $ correspondem ao início/fim de cada linha, não apenas da string inteira.
  • ssingle line ("dotall"): . também corresponde a novas linhas.
  • u — trata o padrão e o assunto como UTF-8. Use para qualquer texto com caracteres não-ASCII.
  • x — estendido: espaços em branco no padrão são ignorados, permitindo espaçar e comentar padrões complexos.

Testando uma correspondência com preg_match

preg_match() retorna 1 se o padrão for encontrado, 0 se não for, e false em caso de erro. É a escolha certa para uma pergunta de sim/não como "esta string contém um dígito?"

php— editable, runs on the server

O terceiro argumento opcional, $matches, é preenchido com os resultados: $matches[0] é a correspondência inteira, e $matches[1], $matches[2], … são os grupos de captura em ordem — as substrings capturadas por cada par de parênteses.

Validando entradas do usuário

Um uso comum de regex é validar entradas do usuário — verificar se um valor tem a forma correta antes de armazená-lo ou confiar nele. Aqui está uma verificação básica de e-mail:

<?php

$email = "[email protected]";

if (preg_match("/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/", $email)) {
    echo "Valid email address";
} else {
    echo "Invalid email address";
}

?>

As âncoras ^ e $ são importantes aqui: sem elas, o padrão corresponderia a um e-mail em qualquer parte de uma string maior, então "junk [email protected] junk" seria aprovado. Com elas, a string inteira deve ser um único e-mail.

Para e-mail especificamente, a função nativa do PHP filter_var() com FILTER_VALIDATE_EMAIL é mais robusta do que uma regex escrita manualmente. Use regex quando precisar de um formato que os filtros não cobrem — códigos postais, IDs personalizados, formatos de telefone. Veja validação de formulários PHP para um exemplo completo de verificação de entradas.

Encontrando todas as correspondências com preg_match_all

Enquanto preg_match() para na primeira ocorrência, preg_match_all() coleta todas — útil para extrair cada hashtag, preço ou link de um bloco de texto.

<?php

$text = "Prices: $12, $7 and $349";

preg_match_all("/\\\$(\d+)/", $text, $matches);

print_r($matches[1]); // the captured numbers

?>

$matches[1] contém um array com cada grupo capturado — neste caso, ["12", "7", "349"].

Substituindo texto com preg_replace

preg_replace() substitui cada correspondência. Na string de substituição, $1, $2, … fazem referência aos grupos capturados, permitindo reescrever além de remover:

<?php

$date = "2026-06-21";

// Reformat YYYY-MM-DD into DD/MM/YYYY
echo preg_replace("/(\d{4})-(\d{2})-(\d{2})/", "$3/$2/$1", $date);
// 21/06/2026

?>

Para dividir uma string em partes com base em um padrão em vez de substituir, use preg_split() — por exemplo, dividindo em qualquer sequência de espaços em branco com /\s+/.

Técnicas avançadas

Quando você estiver confortável com o básico, estes recursos lidam com padrões mais complexos:

  • Grupos de captura (...) — extraem partes específicas de uma correspondência, como mostrado acima com $matches[1].
  • Grupos sem captura (?:...) — agrupam sem preencher um slot em $matches, quando você precisa apenas do agrupamento para um quantificador ou alternância.
  • Grupos nomeados (?<year>\d{4}) — referenciam uma correspondência pelo nome ($matches['year']) em vez de por número.
  • Lookahead (?=...) e lookbehind (?<=...) — correspondem com base no que vem depois ou antes, sem consumi-lo. Útil para "um número seguido de px" sem capturar px.
  • Quantificadores preguiçosos *?, +? — correspondem ao menor número possível de caracteres. Por padrão, .* é guloso e captura tudo que pode.

Uma observação sobre escape: caracteres como ., +, *, ?, (, ), [, \ têm significado especial. Para corresponder a eles literalmente, prefixe com uma barra invertida (\. corresponde a um ponto literal). Quando o texto literal vem de uma variável, use preg_quote() para escapá-lo com segurança.

Erros comuns

  • Esquecer os delimitadores. Padrões PHP são strings e devem incluir delimitadores: "/\d+/", não "\d+". Omiti-los gera um aviso e a correspondência falha.
  • Duplo escape em strings com aspas duplas. Dentro de "...", uma barra invertida também é um escape PHP. "/\d/" funciona porque \d não é um escape PHP, mas para corresponder a um $ literal você precisa de "/\\$/". Strings com aspas simples ('/\d/') evitam essa surpresa.
  • Correspondência gulosa captura demais. <.*> em <a><b> corresponde a todo <a><b>, não apenas a <a>. Use um <.*?> preguiçoso ou uma classe negada <[^>]*>.
  • Omitir o modificador u com UTF-8. Sem /u, . e \w operam em bytes, corrompendo caracteres multibyte.

Conclusão

Expressões regulares permitem descrever a forma do texto em vez de seu conteúdo exato, tornando-as indispensáveis para validar entradas, extrair dados e transformar strings. Em PHP você as utiliza através das funções preg_: preg_match() e preg_match_all() para buscar, preg_replace() para reescrever e preg_split() para dividir strings. Comece com âncoras, classes de caracteres e quantificadores, depois adicione grupos e lookarounds conforme seus padrões crescem. Para aprofundar-se nas strings que você irá corresponder, veja Strings PHP.

Prática

Prática
Qual é o principal objetivo do PHP regex?
Qual é o principal objetivo do PHP regex?
Was this page helpful?