Nenhum produto encontrado nessa seleção.
Não importa se você é um desenvolvedor experiente, ou se está iniciando agora, em algum momento de sua carreira será necessário trabalhar com as expressões regulares. Também não importa a linguagem de programação que você estiver utilizando para desenvolver, as expressões regulares são parte fundamental do seu "kit de ferramentas" disponíveis.
Expressões regulares são utilizadas para encontrar e manipular trechos de texto presentes em determinados tipos de dados em PHP. Elas são tão poderosas que existem metacaracteres padrão, que podem ser combinados para encontrar qualquer trecho de texto, mesmo que você não saiba exatamente o que deseja encontrar. Só é necessário saber o padrão.
Por exemplo:
Suponhamos que você queira validar um campo de input que irá receber uma data no formato que utilizamos aqui no Brasil, DD/MM/AAAA.
Então, já saberíamos o padrão que seria aceitável no valor daquele input: dois números; uma barra; dois números; uma barra; quatro números (ou DD/MM/AAAA). Além disso, ainda poderíamos especificar ainda mais, por exemplo: um número de 0 a 3; um número de 0 a 9; uma barra; um número de 0 a 1; um número de 0 a 2; uma barra; quatro números de 0 a 9 cada.
Ainda que tenhamos falhas (tipo: 39/00/9999) pelo meu exemplo rápido, é assim que as expressões regulares funcionam em PHP, ou em qualquer outra linguagem de programação. Explique o padrão e deixe o código encontrar o que você pediu.
Nesse artigo, você vai aprender a encontrar, substituir e validar qualquer variável utilizando expressões regulares em PHP.
Vamos lá?
Expressões regulares em PHP
Para criar um padrão de expressão regular em PHP, precisamos utilizar delimitadores. Ou seja, se eu precisar encontrar a palavra "lindo" em um texto qualquer, eu preciso escrever /lindo/.
A função preg_match do PHP é uma ótima alternativa para verificar se algo existe em uma variável, veja:
<?php // Um variável qualquer $texto = 'Eu sou lindo!'; // Expressão regular $expressao = '/lindo/'; // Retorna true se a expressão existir no texto $verifica = preg_match( $expressao, $texto); // Verifica se existe if ( $verifica ) { echo "A expressão $expressao existe no texto."; } else { echo "A expressão $expressao não existe no texto."; } ?>
Perceba apenas a linha:
// Expressão regular $expressao = '/lindo/';
As duas barras (/) antes e depois de "lindo" são os delimitadores, que simplesmente servem para demonstrar ao PHP que o valor que está dentro deles é o meu padrão, ou seja, lindo.
A propósito, se eu quiser procurar qualquer palavra, parte de palavra, letra, ou qualquer padrão que eu sei o valor, basta digitar o texto entre os delimitadores / e /. Por exemplo:
Se eu quiser achar a palavra "sou" em "Eu sou lindo", a minha expressão se torna:
$expressao = '/sou/';
Modificadores
Os modificadores não fazem parte do padrão que você está procurando, portanto, eles devem ficar fora da última barra (/) da sua expressão regular, exemplo:
$expressao = '/expressão/modificador';
Os mais utilizados em PHP são:
- i – Esse modificador faz com que a sua expressão regular encontre tanto letras maiúsculas quanto minúsculas;
- m – Esse modificador faz com que sua expressão regular seja multilinhas.
- s – Esse modificador faz com que o ponto (um metacaractere que você vai aprender logo abaixo), funcione em todas as linhas.
Vamos ver como isso funciona na prática.
Repare no trecho de código abaixo:
<?php // Um variável qualquer $texto = "Joãozinho é lindo. Maria é linda"; // Retorna true se a expressão existir no texto $verifica = preg_match( '/maria/', $texto, $encontrado); // Mostra o que foi encontrado echo '<pre>'; print_r( $encontrado ); echo '</pre>'; ?>
Nada será encontrado, pois, em meu texto a palavra "Maria" está com a letra "M" maiúscula; na expressão, pesquisei com todas as letras minúsculas.
Se eu quiser modificar isso para encontrar tanto letras maiúsculas quanto minúsculas, basta adicionar um "i" após a última barra. Veja:
<?php // Um variável qualquer $texto = "Joãozinho é lindo. Maria é linda"; // Retorna true se a expressão existir no texto $verifica = preg_match( '/maria/i', $texto, $encontrado); // Mostra o que foi encontrado echo '<pre>'; print_r( $encontrado ); echo '</pre>'; ?>
Agora eu encontrei o que precisava, ou seja, "Maria".
Além disso, modificadores também podem ser combinados, ou seja:
// Retorna true se a expressão existir no texto $verifica = preg_match_all( '/a/is', $texto, $encontrado);
Também é válido, pois, utiliza a combinação e "i" + "s".
Leia mais sobre modificadores no site do PHP.
Metacaracteres
Até agora, estamos encontrando valores que já conhecemos, ou seja, "Maria" em um texto que tem a palavra "Maria", e assim por diante. Porém, vamos analisar os metacaracteres e fazer algumas coisas mais interessantes:
Metacaractere | Descrição |
---|---|
Normalmente usado como caractere de escape | |
^ | Inicia com |
$ | Termina com |
. | Encontra qualquer caractere, exceto uma nova linha |
[ | Define o início de uma classe de caracteres |
] | Define o final de uma classe de caracteres |
| | Define a separação de alternativas |
( | Inicia um subpadrão |
) | Termina um subpadrão |
? | Encontra 0 ou 1 caractere |
* | Encontra 0 ou mais caracteres |
+ | Encontra 1 ou mais caracteres |
{ | Inicia mínimo / máximo |
} | Finaliza mínimo / máximo |
Com os metacaracteres acima, você pode formar valores que nem conhece, apenas imaginando um padrão. Por exemplo:
Expressão regular | O que vai encontrar |
---|---|
Maria | A string "Maria" |
^Maria | "Maria" no início da string |
Maria$ | "Maria" no fim da string |
^Maria$ | Só "Maria" |
[abc] | a, b, ou c |
[a-z] | Qualquer letra minúscula |
[^A-Z] | Qualquer coisa que não seja uma letra maiúscula |
(gif|jpg) | "gif" ou "jpeg" |
[a-z]+ | Uma ou mais letras minúsculas |
[0-9.-] | Qualquer número, ponto, ou sinal de menos. |
^[a-zA-Z0-9_]{1,}$ | Qualquer palavra com pelo menos uma letra, número ou _ |
([wx])([yz]) | wy, wz, xy, ou xz |
[^A-Za-z0-9] | Qualquer símbolo (não uma letra, nem número) |
([A-Z]{3}|[0-9]{4}) | Três letras ou quatro números |
Sabendo disso, poderíamos encontrar aquela data que descrevi no início do artigo, lembra? (DD/MM/YYYY).
Vamos relembrar o padrão simples que exemplifiquei: dois números; uma barra; dois números; uma barra; quatro números (ou DD/MM/AAAA).
<?php // Um texto que tem uma data $texto = 'Eu nasci em 20/04/1987. Fiz 27 anos em 2014.'; // Expressao regular $expressao = '/d{2}/d{2}/d{4}/'; // Verifica se existe if ( preg_match( $expressao, $texto, $encontrado ) ) { // Retorna: A data 20/04/1987 foi encontrada no texto. echo "A data $encontrado[0] foi encontrada no texto."; }
O trecho de código acima, além de encontrar minha data, ainda exibirá uma frase contendo seu valor: A data 20/04/1987 foi encontrada no texto.
Você deve ter reparado um "d" na expressão regular acima. Isso significa o mesmo que "qualquer número decimal" (de 0 a 9). Eu poderia escrever o mesmo da seguinte maneira:
<?php // Um texto que tem uma data $texto = 'Eu nasci em 20/04/1987. Fiz 27 anos em 2014.'; // Expressao regular $expressao = '/[0-9]{2}/[0-9]{2}/[0-9]{4}/'; // Verifica se existe if ( preg_match( $expressao, $texto, $encontrado ) ) { // Retorna: A data 20/04/1987 foi encontrada no texto. echo "A data $encontrado[0] foi encontrada no texto."; }
Agora vamos para o segundo exemplo: um número de 0 a 3; um número de 0 a 9; uma barra; um número de 0 a 1; um número de 0 a 2; uma barra; quatro números de 0 a 9 cada.
<?php // Um texto que tem uma data $texto = 'Eu nasci em 20/04/1987. Fiz 27 anos em 2014.'; // Expressao regular $expressao = "/[0-3]{1}[0-9]{1}/[0-3]{1}[0-9]{1}/[0-9]{4}/"; // Verifica se existe if ( preg_match( $expressao, $texto, $encontrado ) ) { // Retorna: A data 20/04/1987 foi encontrada no texto. echo "A data $encontrado[0] foi encontrada no texto."; }
Outra coisa que você deve estar percebendo, é que estou utilizando as chaves para selecionar quantos caracteres quero que a expressão anterior encontre.
Vamos ver a expressão regular anterior de maneira mais descritiva:
- [0-3]{1} – Temos aqui uma expressão com um traço, isso significa que a expressão deve encontrar qualquer coisa de 0 até 3 (0, 1, 2 e 3). Na chave com o valor um – {1} – Significa que a expressão deve encontrar apenas um caractere.
- [0-9]{1} – A mesma coisa do exemplo anterior, porém, o range é o maior possível (0 a 9);
- / – Aqui temos um caractere de escape. Isso acontece porque eu quero que a expressão encontre uma barra literal (/), e como as barras são utilizadas como delimitadores, se eu não utilizar a barra invertida para escapar este caractere, terei um erro na expressão.
- [0-3]{1} – A mesma coisa do primeiro exemplo.
- [0-9]{1} – A mesma coisa do segundo exemplo.
- / – A mesma coisa do terceiro exemplo.
- [0-9]{4} – Aqui temos um range de 0 a 9, que pode ter quatro caracteres.
A propósito, quando estamos utilizando a função "preg_match" (como estou), a função para de procurar a expressão assim que detectar o primeiro valor. Se você quiser encontrar todos as vezes que a expressão ocorreu no texto, deve utilizar a função "preg_match_all".
Por exemplo:
<?php // Poema de Cecília Meireles - Prelúdio $preludio = 'Que tempo seria, ó sangue, ó flor em que se amaria de amor! Pérolas de espuma, de espuma e sal. Nunca mais nenhuma igual.'; // Expressao regular $expressao = "/,/"; // Verifica se existe if ( preg_match_all( $expressao, $preludio, $encontrado ) ) { echo '<pre>'; print_r($encontrado); echo '</pre>'; }
Agora modifiquei meu texto para um trecho do poema "Prelúdio" de Cecília Meireles.
Suponhamos que eu queira saber quantas vírgulas existem no trecho do poema:
<?php // Poema de Cecília Meireles - Prelúdio $preludio = 'Que tempo seria, ó sangue, ó flor em que se amaria de amor! Pérolas de espuma, de espuma e sal. Nunca mais nenhuma igual.'; // Expressao regular $expressao = "/,/"; // Verifica se existe if ( preg_match_all( $expressao, $preludio, $encontrado ) ) { echo '<pre>'; print_r($encontrado); echo '</pre>'; }
Com "preg_match", apenas uma vírgula seria encontrada; com "preg_match_all", todas elas são retornadas para o array "$encontrado". Como resultado temos:
Array ( [0] => Array ( [0] => , [1] => , [2] => , ) )
Substituindo valores do texto
Até agora, estamos apenas encontrando valores dentro de strings, porém, também é possível substituir um valor por outro.
Suponhamos que eu queira adicionar uma tag html em todas as letras "a" do meu texto. Veja:
<?php // Poema de Cecília Meireles - Prelúdio $preludio = 'Que tempo seria, ó sangue, ó flor em que se amaria de amor! Pérolas de espuma, de espuma e sal. Nunca mais nenhuma igual.'; // Altera o texto original $preludio = preg_replace('/(a)/i', "<span style='color: red;'>\1</span>", $preludio); // Exibe o texto echo $preludio;
A função "preg_replace" precisa de um mínimo de 3 parâmetros: A expressão regular; o novo valor; a variável que vai receber o texto substituído.
Na expressão acima você viu algumas coisas novas: os parênteses, que indicam que aquilo é um grupo; duas barras, mais um número um – \1.
Isso acontece porque sempre que temos um grupo, podemos recuperar o valor encontrado por duas barras invertidas seguidas de um número de 0 a 9. Se você tiver dois grupos, poderá recuperar o valor encontrado no primeiro grupo por \1, o \2 para o segundo.
Exemplo:
<?php // Poema de Cecília Meireles - Prelúdio $preludio = 'Que tempo seria, ó sangue, ó flor em que se amaria de amor! Pérolas de espuma, de espuma e sal. Nunca mais nenhuma igual.'; // Expressao regular $expressao = "'/(a)(.*?)(e)/i"; // Altera o texto original $preludio = preg_replace( $expressao, "(Primeiro Grupo: \1) (Segundo Grupo: \2) (Terceiro Grupo: \3) ", $preludio ); // Exibe o texto echo $preludio;
No exemplo acima, estou substituindo três grupos: Um apenas com a letra "a"; outro com qualquer coisa que vier depois de "a" e antes de "e"; outro apenas com a letra "e".
Se você quiser remover valores, basta editar o texto de substituição para nada. Por exemplo:
Suponhamos que eu queira remover todos os espaços de uma string:
<?php // Poema de Cecília Meireles - Prelúdio $preludio = 'Que tempo seria, ó sangue, ó flor em que se amaria de amor! Pérolas de espuma, de espuma e sal. Nunca mais nenhuma igual.'; // Expressao regular $expressao = "/s/"; // Altera o texto original $preludio = preg_replace( $expressao, '', $preludio ); // Exibe o texto echo $preludio;
Agora eu removi todos os espaços do texto que estou exibindo.
Concluindo
As expressões regulares, por si só, podem ser consideradas como uma pequena linguagem de programação, pois, podem ser extremamente complexas, mas também podem ser extremamente simples.
Recomendo que estude um pouco mais sobre a utilização de metacaracteres e modificadores para ficar fera em expressões regulares.
Se quiser ler mais a respeito, o manual do PHP é extremamente amplo nesse campo, veja o link abaixo:
Tem exemplos e milhares de funções para que você utilize expressões regulares em PHP.
Outros links úteis:
- Regex Tester – Para testar expressões regulares;
- The Regex Coach – Aplicativo para testar suas expressões regulares.
Em caso de dúvidas, basta perguntar nos comentários abaixo.