PHP

Dominando Expressões Regulares em PHP com preg_match e preg_replace em Projetos Reais

9 min de leitura

Dominando Expressões Regulares em PHP com preg_match e preg_replace em Projetos Reais

Fundamentos de Expressões Regulares em PHP 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 para encontrar padrões e 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. A sintaxe básica segue o padrão . Os delimitadores (/) envolvem o padrão, e após o último delimitador você adiciona modificadores como (case-insensitive) e (global). Antes de mergulhar em casos complexos, é essencial entender metacaracteres fundamentais: (qualquer caractere), + ? ^ $ [] | () php // Exemplo básico: validar se uma string contém um padrão $email = "usuario@dominio.com"; if (pregmatch("/^[a-zA-Z0-9.%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/", $email)) { echo "Email válido!"; } else { echo "Email inválido!"; } pregmatch() $matches php // Extrair data no formato DD/MM/YYYY $texto = "A reunião é em 25/12/2024"; $padrao

<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 = &quot;usuario@dominio.com&quot;;

if (preg_match(&quot;/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/&quot;, $email)) {

echo &quot;Email válido!&quot;;

} else {

echo &quot;Email inválido!&quot;;

}</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 = &quot;A reunião é em 25/12/2024&quot;;

$padrao = &quot;/(\d{2})\/(\d{2})\/(\d{4})/&quot;;

if (preg_match($padrao, $texto, $matches)) {

echo &quot;Data completa: &quot; . $matches[0] . &quot;\n&quot;; // 25/12/2024

echo &quot;Dia: &quot; . $matches[1] . &quot;\n&quot;; // 25

echo &quot;Mês: &quot; . $matches[2] . &quot;\n&quot;; // 12

echo &quot;Ano: &quot; . $matches[3] . &quot;\n&quot;; // 2024

}

// Validar e extrair usuário de URL

$url = &quot;https://github.com/joao-silva&quot;;

preg_match(&quot;/github\.com\/([a-zA-Z0-9_-]+)$/&quot;, $url, $matches);

echo &quot;Usuário: &quot; . $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 = &quot;Adorei! #php #regex #programação&quot;;

$padrao = &quot;/#([a-zA-Z0-9_]+)/&quot;;

preg_match_all($padrao, $post, $matches);

print_r($matches[1]);

// Array ( [0] =&gt; php [1] =&gt; regex [2] =&gt; 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 = &quot;25/12/2024&quot;;

$data_iso = preg_replace(&quot;/(\d{2})\/(\d{2})\/(\d{4})/&quot;, &quot;$3-$2-$1&quot;, $data_br);

echo $data_iso; // 2024-12-25

// Remover múltiplos espaços em branco

$texto = &quot;Olá mundo com espaços&quot;;

$texto_limpo = preg_replace(&quot;/\s+/&quot;, &quot; &quot;, $texto);

echo $texto_limpo; // Olá mundo com espaços

// Adicionar prefixo a cada número encontrado

$ids = &quot;123 456 789&quot;;

$com_prefixo = preg_replace(&quot;/(\d+)/&quot;, &quot;ID-$1&quot;, $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 = [&quot;/\[B\](.?)\[\/B\]/i&quot;, &quot;/\[I\](.?)\[\/I\]/i&quot;];

$substitui = [&quot;&lt;b&gt;$1&lt;/b&gt;&quot;, &quot;&lt;i&gt;$1&lt;/i&gt;&quot;];

$html = preg_replace($padroes, $substitui, &quot;[B]Negrito[/B] e [I]Itálico[/I]&quot;);

echo $html; // &lt;b&gt;Negrito&lt;/b&gt; e &lt;i&gt;Itálico&lt;/i&gt;

// Converter minúsculas para MAIÚSCULAS apenas em números específicos

$numero = preg_replace_callback(&quot;/(\d+)/&quot;, function($m) {

return &quot;NUM-&quot; . strtoupper(dechex($m[1]));

}, &quot;Valores: 255 100 50&quot;);

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 = &quot;123.456.789-10&quot;;

if (preg_match(&quot;/^\d{3}\.\d{3}\.\d{3}\-\d{2}$/&quot;, $cpf)) {

echo &quot;Formato válido&quot;;

}

// Extrair todos os links de uma página HTML

$html = &#039;&lt;a href=&quot;http://exemplo.com&quot;&gt;Link 1&lt;/a&gt; &lt;a href=&quot;http://outro.com&quot;&gt;Link 2&lt;/a&gt;&#039;;

preg_match_all(&#039;/&lt;a\s+href=[&quot;\&#039;](.*?)[&quot;\&#039;]/i&#039;, $html, $links);

print_r($links[1]);

// Array ( [0] =&gt; http://exemplo.com [1] =&gt; http://outro.com )

// Sanitizar nomes de arquivo (apenas alphanuméricas, hífens e underscores)

$filename = &quot;Meu Arquivo@2024!.pdf&quot;;

$safe = preg_replace(&quot;/[^a-zA-Z0-9._-]/&quot;, &quot;&quot;, $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>

Comentários

Mais em PHP

Guia Completo de Testes de Integração e Feature Tests com Laravel
Guia Completo de Testes de Integração e Feature Tests com Laravel

Entendendo Testes de Integração em Laravel Testes de integração verificam com...

Laravel Jobs, Queues e Events na Prática na Prática
Laravel Jobs, Queues e Events na Prática na Prática

Entendendo Jobs, Queues e Events no Laravel Jobs, queues e events são pilares...

Dominando Cache em PHP: Redis, Memcached e Cache de Opcode com OPcache em Projetos Reais
Dominando Cache em PHP: Redis, Memcached e Cache de Opcode com OPcache em Projetos Reais

Cache em PHP: Redis, Memcached e OPcache O cache é um dos pilares da otimizaç...