Expressões regulares
Nesta aula, você aprenderá a trabalhar com expressões regulares em PHP, dominando as funções preg_match e preg_replace, a sintaxe PCRE, o uso de grupos e casos de uso comuns. Através de exemplos práticos e exercícios, você será capaz de aplicar regex em validações, buscas e substituições de texto de forma eficiente.
As expressões regulares (regex) são uma ferramenta poderosa para buscar, validar e manipular texto. Em PHP, elas são implementadas através da biblioteca PCRE (Perl Compatible Regular Expressions), que oferece funções como preg_match e preg_replace. Nesta aula, vamos explorar a sintaxe básica, os conceitos de grupos, e os casos de uso mais comuns, preparando você para aplicar regex em seus projetos.
Dominar expressões regulares é essencial para qualquer desenvolvedor PHP, pois permite realizar tarefas complexas de processamento de texto de forma rápida e elegante, como validação de e-mails, extração de dados de strings, e substituições avançadas.
preg_match, preg_replace
As funções preg_match e preg_replace são as mais utilizadas para trabalhar com regex em PHP. preg_match verifica se uma string corresponde a um padrão, enquanto preg_replace substitui ocorrências do padrão por um texto de substituição.
Exemplo de uso de preg_match para validar um formato de data:
$data = '2025-04-10';
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $data)) {
echo "Data válida";
} else {
echo "Data inválida";
}Já preg_replace substitui todas as ocorrências do padrão. Por exemplo, para substituir espaços por underscores:
$texto = "Olá mundo PHP";
$novo = preg_replace('/\s+/', '_', $texto);
echo $novo; // Olá_mundo_PHPSintaxe PCRE
Os padrões PCRE são delimitados por barras / (ou outros delimitadores) e podem incluir modificadores, como i (case-insensitive), m (multiline) e s (dotall). A sintaxe básica inclui metacaracteres como . (qualquer caractere), * (zero ou mais), + (um ou mais), ? (zero ou um), e classes de caracteres como \d (dígito), \w (palavra), \s (espaço).
Exemplo de padrão com modificador i para buscar "php" ignorando maiúsculas:
$texto = "PHP é uma linguagem poderosa.";
if (preg_match('/php/i', $texto)) {
echo "Encontrou PHP";
}Grupos
Grupos são delimitados por parênteses () e permitem agrupar partes do padrão, além de capturar substrings para uso posterior. Grupos de captura são numerados a partir de 1, e podem ser referenciados em substituições com $1, $2, etc.
Exemplo de uso de grupos para extrair nome e domínio de um e-mail:
$email = "usuario@exemplo.com";
preg_match('/([a-zA-Z0-9._-]+)@([a-zA-Z0-9.-]+)/', $email, $matches);
echo "Usuário: {$matches[1]}\n";
echo "Domínio: {$matches[2]}\n";Também é possível usar grupos não capturantes com (?:), que não armazenam a correspondência.
Casos comuns
Expressões regulares são frequentemente usadas para validação de dados (CPF, CNPJ, telefone), extração de informações (URLs, datas) e sanitização de entradas. Vamos ver alguns exemplos práticos.
Validação de CPF (apenas formato, não dígitos verificadores):
$cpf = "123.456.789-00";
if (preg_match('/^\d{3}\.\d{3}\.\d{3}-\d{2}$/', $cpf)) {
echo "CPF no formato correto";
}Extração de URLs de um texto:
$texto = "Visite https://www.exemplo.com e http://outro.org";
preg_match_all('/https?:\/\/[\w.-]+/', $texto, $urls);
print_r($urls[0]);Sanitização removendo tags HTML:
$html = "Texto importante
";
$semTags = preg_replace('/<[^>]*>/', '', $html);
echo $semTags; // Texto importanteBoas práticas e observações finais
Ao usar expressões regulares, sempre teste seus padrões com ferramentas online ou com casos de borda. Evite regex complexas quando funções nativas de string podem resolver, como str_replace para substituições simples. Lembre-se de escapar caracteres especiais quando necessário e considere o desempenho em loops grandes.
Referências
- PHP Manual - PCRE
- preg_match
- preg_replace
- Sintaxe PCRE
- Introdução a regex
- Regular-Expressions.info
- Regex101 - Testador online
Exercícios
- Escreva uma função PHP que valide se uma string é um número de telefone no formato (XX) XXXXX-XXXX.
- Usando preg_replace, remova todos os espaços em branco extras de uma string, deixando apenas um espaço entre palavras.
- Extraia todas as datas no formato dd/mm/aaaa de um texto usando preg_match_all.
- Escreva uma expressão regular para validar uma senha forte: pelo menos 8 caracteres, contendo letras maiúsculas, minúsculas, números e caracteres especiais.
- Usando grupos, capture o nome de usuário e o domínio de um e-mail e imprima-os separadamente.
function validaTelefone($tel) {
return (bool) preg_match('/^\(\d{2}\) \d{5}-\d{4}$/', $tel);
}$texto = "Olá mundo PHP";
$limpo = preg_replace('/\s+/', ' ', $texto);
echo $limpo; // Olá mundo PHP$texto = "A data de hoje é 10/04/2025 e amanhã será 11/04/2025.";
preg_match_all('/\d{2}\/\d{2}\/\d{4}/', $texto, $datas);
print_r($datas[0]);$senha = "Senha@123";
if (preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/', $senha)) {
echo "Senha forte";
}$email = "joao.silva@exemplo.com.br";
if (preg_match('/^([a-zA-Z0-9._-]+)@([a-zA-Z0-9.-]+)$/', $email, $matches)) {
echo "Usuário: {$matches[1]}\n";
echo "Domínio: {$matches[2]}\n";
}