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:
| Token | Significado | Exemplo de correspondência |
|---|---|---|
. | Qualquer caractere único (exceto nova linha) | c.t → cat, cut |
\d | Um dígito 0-9 | \d\d → 42 |
\w | Um caractere "word" (a-z, A-Z, 0-9, _) | \w+ → hello_1 |
\s | Espaç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 a | a, aaa |
a? | Zero ou um a (opcional) | "", a |
a{2,4} | Entre 2 e 4 de a | aa, aaaa |
^ / $ | Início / fim da string | — |
| | Alternância ("ou") | cat|dog → cat 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ção | O 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/modifiersO 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 slashesmodifiers 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/icorresponde aPHP,Php,php.m— multimodo:^e$correspondem ao início/fim de cada linha, não apenas da string inteira.s— single 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?"
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 depx" sem capturarpx. - 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\dnã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
ucom UTF-8. Sem/u,.e\woperam 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.