<h2>Fundamentos de Expressões Regulares em PHP</h2>
<p>Expressões regulares (regex) são padrões poderosos para buscar, validar e manipular texto. Em PHP, você trabalha com elas através de funções PCRE (Perl Compatible Regular Expressions). As duas funções mais importantes são <code>preg_match()</code> para encontrar padrões e <code>preg_replace()</code> para substituir conteúdo. Dominar essas funções abre portas para validação de dados, parsing de textos complexos e automação de tarefas que seriam impossíveis com simples comparações de strings.</p>
<p>A sintaxe básica segue o padrão <code>/padrão/modificadores</code>. Os delimitadores (/) envolvem o padrão, e após o último delimitador você adiciona modificadores como <code>i</code> (case-insensitive) e <code>g</code> (global). Antes de mergulhar em casos complexos, é essencial entender metacaracteres fundamentais: <code>.</code> (qualquer caractere), <code>*</code> (0 ou mais), <code>+</code> (1 ou mais), <code>?</code> (0 ou 1), <code>^</code> (início), <code>$</code> (fim), <code>[]</code> (classe de caracteres), <code>|</code> (ou), <code>()</code> (grupo/captura).</p>
<pre><code class="language-php">// Exemplo básico: validar se uma string contém um padrão
$email = "usuario@dominio.com";
if (preg_match("/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/", $email)) {
echo "Email válido!";
} else {
echo "Email inválido!";
}</code></pre>
<h2>preg_match(): Buscando e Capturando Padrões</h2>
<p>A função <code>preg_match()</code> retorna 1 se encontra uma correspondência, 0 se não encontra, e false em caso de erro. Seu maior poder está no terceiro parâmetro: um array que captura grupos definidos com parênteses. Cada grupo capturado fica armazenado no array <code>$matches</code>, onde o índice 0 é sempre a correspondência completa, e os índices subsequentes são seus grupos.</p>
<pre><code class="language-php">// Extrair data no formato DD/MM/YYYY
$texto = "A reunião é em 25/12/2024";
$padrao = "/(\d{2})\/(\d{2})\/(\d{4})/";
if (preg_match($padrao, $texto, $matches)) {
echo "Data completa: " . $matches[0] . "\n"; // 25/12/2024
echo "Dia: " . $matches[1] . "\n"; // 25
echo "Mês: " . $matches[2] . "\n"; // 12
echo "Ano: " . $matches[3] . "\n"; // 2024
}
// Validar e extrair usuário de URL
$url = "https://github.com/joao-silva";
preg_match("/github\.com\/([a-zA-Z0-9_-]+)$/", $url, $matches);
echo "Usuário: " . $matches[1]; // joao-silva</code></pre>
<p>Use classes de caracteres <code>[a-z]</code>, <code>[0-9]</code>, <code>\d</code> (dígitos), <code>\w</code> (palavras), <code>\s</code> (espaços) para padrões comuns. A função <code>preg_match_all()</code> é similar, mas encontra <strong>todas</strong> as correspondências, retornando a quantidade de encontros e preenchendo um array estruturado diferente. Para cada encontro adicional, use modificadores quantificadores: <code>{n}</code> (exatamente n), <code>{n,}</code> (n ou mais), <code>{n,m}</code> (entre n e m).</p>
<pre><code class="language-php">// Encontrar TODAS as hashtags em um texto
$post = "Adorei! #php #regex #programação";
$padrao = "/#([a-zA-Z0-9_]+)/";
preg_match_all($padrao, $post, $matches);
print_r($matches[1]);
// Array ( [0] => php [1] => regex [2] => programação )</code></pre>
<h2>preg_replace(): Substituindo e Transformando Conteúdo</h2>
<p><code>preg_replace()</code> é sua ferramenta para transformar strings baseado em padrões. Recebe três parâmetros obrigatórios: padrão, substituição e assunto. Você pode usar grupos capturados na substituição através de <code>$1</code>, <code>$2</code>, etc., referenciando os grupos do padrão. Isso permite transformações avançadas sem processamento adicional em PHP.</p>
<pre><code class="language-php">// Converter data de DD/MM/YYYY para YYYY-MM-DD
$data_br = "25/12/2024";
$data_iso = preg_replace("/(\d{2})\/(\d{2})\/(\d{4})/", "$3-$2-$1", $data_br);
echo $data_iso; // 2024-12-25
// Remover múltiplos espaços em branco
$texto = "Olá mundo com espaços";
$texto_limpo = preg_replace("/\s+/", " ", $texto);
echo $texto_limpo; // Olá mundo com espaços
// Adicionar prefixo a cada número encontrado
$ids = "123 456 789";
$com_prefixo = preg_replace("/(\d+)/", "ID-$1", $ids);
echo $com_prefixo; // ID-123 ID-456 ID-789</code></pre>
<p>Para trabalhar com arrays, use <code>preg_replace()</code> com arrays como primeiro e segundo parâmetros — cada padrão será substituído pelo correspondente. <code>preg_replace_callback()</code> oferece ainda mais controle, permitindo uma função para processar cada correspondência dinamicamente. Isso é essencial quando a substituição não é simples ou depende de lógica adicional.</p>
<pre><code class="language-php">// Substituir múltiplos padrões com arrays
$padroes = ["/\[B\](.?)\[\/B\]/i", "/\[I\](.?)\[\/I\]/i"];
$substitui = ["<b>$1</b>", "<i>$1</i>"];
$html = preg_replace($padroes, $substitui, "[B]Negrito[/B] e [I]Itálico[/I]");
echo $html; // <b>Negrito</b> e <i>Itálico</i>
// Converter minúsculas para MAIÚSCULAS apenas em números específicos
$numero = preg_replace_callback("/(\d+)/", function($m) {
return "NUM-" . strtoupper(dechex($m[1]));
}, "Valores: 255 100 50");
echo $numero; // Valores: NUM-FF NUM-64 NUM-32</code></pre>
<h2>Casos Práticos Essenciais</h2>
<p>Na prática profissional, você usa regex para validar CPF/CNPJ, formatar telefones, sanitizar entrada de usuários e extrair dados de HTML ou APIs. Sempre lembre: regex é poderosa mas pode ficar ilegível rapidamente. Use <code>x</code> modificador para comentar padrões complexos, dividindo em múltiplas linhas. Teste seus padrões em ferramentas online antes de integrar ao código.</p>
<pre><code class="language-php">// Validar CPF (formato XXX.XXX.XXX-XX)
$cpf = "123.456.789-10";
if (preg_match("/^\d{3}\.\d{3}\.\d{3}\-\d{2}$/", $cpf)) {
echo "Formato válido";
}
// Extrair todos os links de uma página HTML
$html = '<a href="http://exemplo.com">Link 1</a> <a href="http://outro.com">Link 2</a>';
preg_match_all('/<a\s+href=["\'](.*?)["\']/i', $html, $links);
print_r($links[1]);
// Array ( [0] => http://exemplo.com [1] => http://outro.com )
// Sanitizar nomes de arquivo (apenas alphanuméricas, hífens e underscores)
$filename = "Meu Arquivo@2024!.pdf";
$safe = preg_replace("/[^a-zA-Z0-9._-]/", "", $filename);
echo $safe; // MeuArquivo2024.pdf</code></pre>
<h2>Conclusão</h2>
<p>Dominar <code>preg_match()</code> e <code>preg_replace()</code> significa ganhar eficiência brutal em validação e transformação de dados. O primeiro captura e extrai informações estruturadas; o segundo transforma conteúdo em escala. Lembre-se: sempre teste seus padrões com casos extremos (strings vazias, caracteres especiais, Unicode), use <code>preg_last_error()</code> para debugar e documente padrões complexos com comentários. A prática constante transformará regex de um mistério em uma ferramenta natural no seu arsenal de programador.</p>
<h2>Referências</h2>
<ul>
<li><a href="https://www.php.net/manual/pt_BR/function.preg-match.php" target="_blank" rel="noopener noreferrer">Documentação oficial PHP - preg_match()</a></li>
<li><a href="https://www.php.net/manual/pt_BR/function.preg-replace.php" target="_blank" rel="noopener noreferrer">Documentação oficial PHP - preg_replace()</a></li>
<li><a href="https://regexone.com/" target="_blank" rel="noopener noreferrer">RegexOne - Tutorial Interativo de Expressões Regulares</a></li>
<li><a href="https://regex101.com/" target="_blank" rel="noopener noreferrer">Regex101 - Testador Online com Explicações</a></li>
<li><a href="https://phptherightway.com/#strings_and_regular_expressions" target="_blank" rel="noopener noreferrer">PHP: The Right Way - Strings and Regular Expressions</a></li>
</ul>