PHPit - PHP

"Agora, pois, permanecem a fé, a esperança, o amor, estes três; mas o maior destes é o amor." (I Coríntios 13:13)

Entendendo as Expressões Regulares

Prefácio


E o assunto hoje é Expressões Regulares!

Com algumas vasculhadas pela internet podemos encontrar inúmeras definições para expressões regulares, porém, vou ficar com a da Wikipédia de lingua portuguesa.

Uma expressão regular, na Informática, define um padrão a ser usado para procurar ou substituir palavras ou grupos de palavras. É um meio preciso de se fazer buscas de determinadas porções de texto.
Por exemplo, se o conjunto de palavras for {asa, carro, jardim, ovos, terra} e a expressão regular buscar por um padrão rr, obterá as palavras carro e terra.
Existem diferentes formatos para definir-se expressões regulares, porém com algumas noções gerais é possível entender boa parte das expressões.

Fonte: Wikipédia - Expressão Regular

Conceito


As Expressões Regulares (ER, Ereg ou RegEx - para os mais íntimos), então, são um método rápido e simples de manipulação e combinação avançada de strings.

Vamos partir do princípio! Uma expressão regular é essencialmente um padrão. É com base nesse padrão que a expressão em questão será avaliada. Primeiro vamos aprender a sintaxe das expressões para depois aprender como fazê-las funcionar...

Operador ^


Este é o primeiro operador que vamos aprender. O ^ indica que a expressão deve iniciar com a string dada.

^era


Esta sintaxe irá definir que a string dada deverá começar com 'era'. No caso, "era uma vez" seria uma string concordante. Porém, se você tentar "Ele era triste", não obterá sucesso.

Operador $


Já que temos o operador para definir o começo, temos que ter um para definir o final também! Com $ nós definimos a string que deverá conincidir com o final.

fim$


Esta sintaxe irá definir que a string dada deverá terminar com 'fim'. Tentando validar a string "E nunca terá fim" obteremos sucesso, o que não acontecerá com a string "O fim está próximo".

Caracteres em Branco e Caracteres de Escape


Assim como no PHP, em expressões regulares nós temos também que nos utilizar de caracteres de escape, a saber: barra invertida (\).

Segue, então, a lista com os caracteres de espaço em branco e alguns caracteres que necessitam de escape.

\t - Caracter de tabulação
\n - Nova linha
\f - Avanço de página
\r - Retorno de carro

\. - Qualquer caractere
\\ - Uma barra invertida literal
\- - Um hífen literal


... e com alguma garimpada pela rede você consegue encontrar uma lista mais completa!

Classes de Caracteres


Classes de caracteres são uma espécie de grupo que contêm todas as ocorrências que deverão (ou não deverão) constar em uma expressão...

Por exemplo... Para permitir apenas letras vogais, usaríamos:

[AaEeIiOoUu]


Então com este código teríamos um padrão que só permitirá que apenas vogais estejam na string dada.

Vamos agora aprender intervalo de caracteres

[a-z] - Qualquer letra minúscula
[A-Z] - Qualquer letra maiúscula
[a-zA-Z] - Qualquer letra maiúscula ou minúscula
[0-9] - Qualquer número
[0-9\.\-] - Qualquer número, ponto ou sinal de subtração


Bom... Tudo muito legal, muito simples... Mas isto serve apenas para combinação de UM caractere.

^[a-z][0-9]$


Neste caso teríamos uma expressão de apenas dois caracteres em que o primeiro tem necessariamente que ser uma letra minúscula e o segundo ser um número.

Agora vamos aprender outra função para o operador ^! Fora de uma classe de caracteres, ele serve para demonstrar o que deve haver no início, porém dentro, ele serve para mostrar o que não deve ocorrer.

^[^0-9][0-9]$


Aqui nós definimos que a expressão deve começar com um caractere que não seja um número e seja imediatamente seguido por um caractere que será um número!

Classes de Caracteres Pré-definidas


Para evitar chateação, foram criadas as classes de caracteres pré-definidas que já vêm junto com o interpretador de ER que você estiver utilizando (lembrando que estão presentes apenas no método POSIX).

[[:alpha:]] // Qualquer letra (alfabético)
[[:digit:]] // Qualquer número (dígito)
[[:alnum:]] // Qualquer letra ou número (alfanumérico)
[[:space:]] // Qualquer caractere de espaço
[[:upper:]] // Qualquer letra maíuscula
[[:lower:]] // Qualquer letra minúscula
[[:punct:]] // Qualquer caractere de pontuação
[[:xdigit:]] // Qualquer dígito hexadecimal (Equivalente a: [0-9a-fA-F])


Ocorrências Múltiplas


Agora vamos pra parte em que realmente começa a fazer sentido usar-se expressões regulares.

^[[:alpha:]]{3}$ // Qualquer palavra de três letras
^a{4}$ // Só fecha com a expressão 'aaaa'
^a{2,4}$ // Fecha com 'aa', 'aaa' e 'aaaa'
^a{2,}$ // Fecha com 'aa', 'aaa', 'aaaa', 'aaaaa' e assim por diante


Até aqui... Tudo tranquilo? Então vamos em frente!

Há outros modos de representar a repetição de caracteres!

? - Uma ocorrência ou nenhuma (Equivale a {0,1})
* - Nenhuma ocorrência, uma ocorrência, duas ocorrências e por aí vai (Equivale a {0,})
+ - Uma ou mais ocorrências (Equivale a {1,})


Se até aqui foi tudo tranqüilo, estamos muito bem! :)

Vamos então para o tópico final de expressões regulares

Alternação e Parênteses


A alternação se baseia no caractere de "pipe", o famoso |. Ele é bem parecido com o operador lógico OR. Por exemplo...

r|s é equivalente a [rs]


Para caracteres simples é com certeza mais conveniente utilizar as classes. A alternação é basicamente útil para utilizar alternância de palavras.

João|Maria|José


Esta expressão só irá retornar verdadeiro se a string dada for "João" OU "Maria" OU "José".

Agora vamos aos parênteses. Eles tem uma função muito importante.
Caso você utilize

feliz+

Somente fecharia com:
feliz
felizz
felizzz
felizzzz
...


Porém com os parênteses, temos um jeito mais interessante de interar com palavras repetidas.

(feliz)+

Irá fechar com:
feliz
felizfeliz
felizfelizfeliz
...


Quando utilizados em conjunto, obtemos bastante flexibilidade para nossas expressões regulares.

(fel|g|aprend)iz

Irá fechar com:
feliz
giz
aprendiz

-----------
João|Maria$ - Fecha com 'João' em qualquer parte da string ou com 'Maria' no final
(João|Maria)$ - Fecha tanto com "João" quanto "Maria", porém, no final da string
([ab])([xy]) - Fecha com 'ax', 'ay', 'bx' e 'by'


E fim de papo!

Utilizando expressões regulares no PHP


Agora que já aprendemos essa porrada de regras, temos que saber como aplicá-las! (Lembrando que este é o método POSIX. Caso você vá utilizar ER em outra linguagem, pode ter de fazer algumas adaptações)

ereg() e eregi()



Vou ensinar apenas essas duas... Caso você queira se aprofundar mais, olhe no manual do php no capitulo de expressões regulares! :)

int ereg(string padrão, string fonte [, array registro]);

Esta função retorna TRUE se o padrão dado for encontrado na fonte e FALSE caso contrário.

Código: Alternar entre o modo de cópia/destaque
  1. <?php
  2.  
  3. $email = 'mario@gmail.com';
  4. $padrao = "^(.+)@(.+)\.(.+)$";
  5.  
  6. if (ereg($padrao,$mail)) {
  7. print 'Seu email passou na validacao';
  8. }
  9. else {
  10. print 'Seu email nao passou na validacao';
  11. }
  12.  
  13. ?>
<?php

$email 
'mario@gmail.com';
$padrao "^(.+)@(.+)\.(.+)$";

if (
ereg($padrao,$mail)) {
    print 
'Seu email passou na validacao';
}
else {
    print 
'Seu email nao passou na validacao';
}

?>


O que temos?
A string dada deverá começar com algum caractere qualquer em qualquer quantidade, seguido de uma arroba, seguido de mais qualquer caractere em qualquer quantidade, seguido de um ponto literal, seguido de mais qualquer sequência de caracteres, que deverão então finalizar a string.
A função eregi() se comporta de modo semelhante, porém não diferencia maiúsculas e minúsculas.

Conclusão


O mundo das expressões regulares é muito grande e abrangente. Com certeza não vai ser com essa passada de olho que você vai se tornar um expert em ER, mas serve pra dar uma noção do que elas são e para que servem!

Um grande abraço a todos e fiquem com Deus!

Rafael Jaques

Dim dim

 

Comentaí! (33)

Mazááá!!

Agora vou saber como "usar" as expressões regulares! 4nd3rs0n (Kuen com balaca no nome) em 12/11/2007 às 13:13 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.9 no Windows Windows XP
Ae Rafa, show de bola esse post, expressões regulares são importantes para quem tem um caminho a seguir pela programação. Assunto inevitável, parabéns pelo post e pelo blog que tá com o layout 100% aqui no Feisty Fawn...

abraço Xorna em 12/11/2007 às 16:40 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.3 no Ubuntu Linux Ubuntu Linux
Dessa vez acho que eu aprendo :D Tomas em 13/11/2007 às 07:20 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.9 no Windows Windows Vista
Car#$%, acho que agora finalmente entendí expressões regulares...

Flw Anderson Triacca em 13/11/2007 às 09:43 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.9 no Windows Windows XP
Mazaááá....

Grande Rafa...vou usar sim, no Linux vai ajudar um monte...
so tem que ler neh...

hehe

sucesso pra ti Esdras em 13/11/2007 às 15:21 utilizando o Internet Explorer Internet Explorer 6.0 no Windows Windows XP
Iae Mew..

Muito bom o artigo, parabéns!!!

ER é muito importante mesmo, aqui no VIM eu uso toda hora.. quebra um galho muito grande... produtividade ao máximo!!

Abraços felipe tonello em 14/11/2007 às 13:44 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.8 no Linux Linux
Parabéns cara, apesar de ter pouco conteudo tem muita qualidade André em 11/06/2008 às 09:52 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.14 no Windows Windows XP
Eu estava procurando algo que me explica sobre expressão regular! Você é um anjo da guarda! Valeu cara! Alexandre Borges Souza em 02/03/2009 às 19:41 utilizando o Mozilla Firefox Mozilla Firefox 3.0.6 no Windows Windows Vista
<script>alert("Xss");</script> .bnj em 21/03/2009 às 01:43 utilizando o Google Chrome Google Chrome 1.0.154.48 no Windows Windows Vista
<iframe src="http://www.google.com" width="300" onload=alert("Xss"); > giuñ em 21/03/2009 às 01:44 utilizando o Google Chrome Google Chrome 1.0.154.48 no Windows Windows Vista
Eu acho que vou deixar aí esses dois comentários acima! :P Rafael Jaques em 21/03/2009 às 09:13 utilizando o Mozilla Firefox Mozilla Firefox 3.0.7 no Mac OS Mac OS X
Parabéns pelo post, mto bom! Ederson Dias em 25/03/2009 às 18:05 utilizando o Mozilla Firefox Mozilla Firefox 3.0.1 no Windows Windows XP
Bem legal esse artigo, pô!

mesmo eu programando em asp.net, foi bem útil esse artigo, está muito bem explicado! :D

E esses comentários aí da pessoa tentando colocar um script foi legal.. kkkkkkk

Abraços, Wesley em 26/03/2009 às 16:59 utilizando o Mozilla Firefox Mozilla Firefox 3.0.7 no Windows Windows Vista
Eu queria uma explicação de como definir um número mínimo de números para uma estring,
Ex A senha deve conter pelo menos 3 números e no mínimo 6 caracteres....

Valeu Junior em 15/04/2009 às 15:48 utilizando o Internet Explorer Internet Explorer 7.0 no Windows Windows XP
Rafael,

muito obrigado pelo artigo, me ajudou muito a desenvolver um problema aqui no trabalho, mas por faltade tempo e preguiça nunca optaava por estudar "expressões regulares", agora parando e analisando, não adianta, mesmo que tendo que quebrar a cabeça um pouquinho muitas vezes é a melhor saída, ainda mais quem trabalha com conteúdo de texto. Valeu mesmo. Só um acertozinho: no exemplo você declarou com a variável $email, depois na hora de jogar dentro da função eregi(); você pôs $mail. Só acerta isso lá. Nada que vai atrapalhar o aprendizado, mas é só um acertozinho a fazer...

GRande Abraços!!!!!

Gabriel Antunes. Gabriel Antunes em 24/04/2009 às 17:20 utilizando o Mozilla Firefox Mozilla Firefox 3.0.6 no Linux Linux
Primeiro lugar: essa perguntinha ai pra validar esse comentário é ruim.

Pergunta: qual a cor do círculo na bandeira do japão?

Eu sou daltônico!!!! Sacanagem!

Bom... o artigo é nota 10!

Não sabia fazer um expressão regular com 100% de certeza até ler esse artigo!!

Parabéns! CAIO em 18/06/2009 às 11:31 utilizando o Google Chrome Google Chrome 1.0.154.36 no Windows Windows XP
Show de bola, muito explicativo e direto, me ajudou bastante, obrigado!

Abraço. Marcel em 16/07/2009 às 23:55 utilizando o Mozilla Firefox Mozilla Firefox 3.5 no Windows Windows Vista
Muito interessante... eu realmente não tinha noção de como funcionavam, embora já tivesse manipulado algumas expressões já criadas por outros programadores...
Este foi o inicio, vou me aprofundar... Nei em 28/07/2009 às 13:26 utilizando o Mozilla Firefox Mozilla Firefox 3.5.1 no Windows Windows NT
Vlw ajudo mt tio SPAMER em 04/08/2009 às 21:30 utilizando o Opera Opera 9.64 no Windows Windows XP
muito bom o artivo
vlw aneildo em 11/08/2009 às 13:48 utilizando o Mozilla Firefox Mozilla Firefox 3.0.13 no Windows Windows NT
Hmm... Então quer dizer que no final das contas ER não morde...

Bom artigo, obrigado. Jio em 18/08/2009 às 08:47 utilizando o Mozilla Firefox Mozilla Firefox 3.0.13 no Ubuntu Linux Ubuntu Linux
Bem legal o artigo, parabéns! Gostaria de colocar um link no meu blog... Estou autorizado? Rs... Um abraço. Thiago Colares em 09/10/2009 às 09:50 utilizando o Mozilla Firefox Mozilla Firefox 3.0.14 no Ubuntu Linux Ubuntu Linux
Muito bom cara, parabéns eu realmente entendi por aqui mais sobre ER. abs... Ricardo em 22/10/2009 às 08:59 utilizando o Mozilla Firefox Mozilla Firefox 3.5.3 no Windows Windows XP
thanks roger em 20/11/2009 às 18:55 utilizando o Mozilla Firefox Mozilla Firefox 3.5.5 no Windows Windows Vista
Muito bom o artigo! Parabéns continue escrevendo bons artigos.
Obrigado! Luiz Henrique em 11/12/2009 às 09:40 utilizando o PHP PHP
Muito legal kra achei massa Rogério em 24/01/2010 às 10:45 utilizando o Mozilla Firefox Mozilla Firefox 3.5.7 no Windows Windows NT
Cara, muito bom, estava pesquisando sobre urls amigaveis no PHP e acabei me deparando com esse ótimo tutorial.

Meus parabens!! Fernando Wobeto em 23/02/2010 às 02:34 utilizando o Google Chrome Google Chrome 4.0.249.89 no Windows Windows XP
Ótimo tutorial... mas só lembrando a galera que as funções ereg e as demais da mesma classe foram depreciadas no PHP 5.3 e serão excluidas no PHP6 =[ ... ou seja, cuidado quanto ao uso... a solução seria a preg_match... Jefferson Souza em 15/03/2010 às 20:49 utilizando o Mozilla Firefox Mozilla Firefox 3.6 no Windows Windows Vista
pois bem, estava eu navegando pelo google em busca de expressões regulares, e seu blog apareceu por primeiro! bacana não? hehe.

muito bom o post, finalmente comecei a entender o sentido de todos aqueles caracteres.hehehe.

agora vamos tentar usa-los. grande abraço! Jason em 22/03/2010 às 10:54 utilizando o Mozilla Firefox Mozilla Firefox 3.6 no Windows Windows NT
Excelente post, sobre expressões regulares sempre tive dificuldades de ententer esse assunto, bem se vê que você teve trabalho de fazer um post que não fosse um CTRL C, CTRL V como a gente encontra por ai. Parabéns!Ajudou muito Bruno em 08/04/2010 às 13:47 utilizando o Mozilla Firefox Mozilla Firefox 3.5.3 no Ubuntu Linux Ubuntu Linux
muito bom, valeu Magnus em 28/05/2010 às 15:12 utilizando o Mozilla Firefox Mozilla Firefox 3.6.3 no Windows Windows NT
Cara, muito bom.
Finalmente tive uma noção sobre o que são as ER.
Muito obrigado mesmo.
Preciso usar isso no meu .htaccess.
Vlw! Jordão em 30/07/2010 às 14:07 utilizando o Mozilla Firefox Mozilla Firefox 3.6.8 no Windows Windows XP
Parabéns cara, muito bom.
Finalmente consegui entender... rsrsrsrs JL Almeida Neto em 09/08/2010 às 10:33 utilizando o Google Chrome Google Chrome 5.0.375.125 no Windows Windows XP
 

Comenta logo, pô!

* Todos os links inseridos nos comentários possuem rel="nofollow" para impedir com que crawlers considerem os mesmos como relevantes.
* Os e-mails não são divulgados.

Dados pessoais

Você é realmente um humano?

Finalmente, digite seu comentário :)

Caixinha de Sugestões

O que é isso? Aqui você pode simplesmente digitar uma sugestão (artigos, resenhas, melhorias, etc) sem precisar preencher longos formulários. Digite o que quiser na caixinha abaixo e eu lerei com o maior prazer! Se quiser se identificar, fique a vontade!

O PHPit é redigido e mantido por Rafael Jaques - Política de Privacidade.

XHTML/CSS desenvolvido por André Gazola.

PHPit 2007 - 2009 - Alguns direitos reservados.

Feeds ;)

Creative Commons License

PHPit por Rafael Jaques é licensiado sob a Creative Commons Atribuição-Uso Não-Comercial-Compartilhamento pela mesma Licença 2.5 Brasil License.