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";
}

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_PHP

Sintaxe 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 importante

Boas 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

Exercícios

  1. Escreva uma função PHP que valide se uma string é um número de telefone no formato (XX) XXXXX-XXXX.
  2. ✓ Resposta:
    function validaTelefone($tel) {
        return (bool) preg_match('/^\(\d{2}\) \d{5}-\d{4}$/', $tel);
    }
  3. Usando preg_replace, remova todos os espaços em branco extras de uma string, deixando apenas um espaço entre palavras.
  4. ✓ Resposta:
    $texto = "Olá    mundo   PHP";
    $limpo = preg_replace('/\s+/', ' ', $texto);
    echo $limpo; // Olá mundo PHP
  5. Extraia todas as datas no formato dd/mm/aaaa de um texto usando preg_match_all.
  6. ✓ Resposta:
    $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]);
  7. 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.
  8. ✓ Resposta:
    $senha = "Senha@123";
    if (preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/', $senha)) {
        echo "Senha forte";
    }
  9. Usando grupos, capture o nome de usuário e o domínio de um e-mail e imprima-os separadamente.
  10. ✓ Resposta:
    $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";
    }