Você está na página 1de 14

PHPit - Entendendo as Expressões Regulares - PHP http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.

phpit

Principal Artigos Busca Seja meu aluno Sobre Contato

"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 Dim dim

Regulares
12 de novembro de 2007 - Por Rafael Jaques

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

1 de 14 6/10/2010 14:05
PHPit - Entendendo as Expressões Regulares - PHP http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit

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

2 de 14 6/10/2010 14:05
PHPit - Entendendo as Expressões Regulares - PHP http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit

\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,

3 de 14 6/10/2010 14:05
PHPit - Entendendo as Expressões Regulares - PHP http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit

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})

4 de 14 6/10/2010 14:05
PHPit - Entendendo as Expressões Regulares - PHP http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit

* - 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:

5 de 14 6/10/2010 14:05
PHPit - Entendendo as Expressões Regulares - PHP http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit

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

6 de 14 6/10/2010 14:05
PHPit - Entendendo as Expressões Regulares - PHP http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit

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. ?>

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

Comentaí!
Tomas
felipe
André
Rafael
Thiago(35)
Anderson
Esdras
Alexandre
.bnj
giuñ
Ederson
Wesley
Junior
Gabriel
CAIO
Marcel
Nei
SPAMER
aneildo
Jio
Ricardo
roger
Luiz
Rogério
Fernando
Jefferson
Jason
Bruno
Magnus
Jordão
JL
Inacio
Tiago
Almeida
Henrique
em
em
em
em
Butzke
tonello
em
Jaques
em
Colares
Antunes
em
em
21/03/2009
Dias
21/03/2009
18/08/2009
em
Souza
28/07/2009
20/11/2009
em
Triacca
Wobeto
em
11/06/2008
08/04/2010
15/04/2009
16/09/2010
Borges
16/07/2009
em
13/11/2007
30/07/2010
Neto
18/06/2009
22/10/2009
22/03/2010
13/11/2007
26/03/2009
em
11/08/2009
24/01/2010
28/05/2010
em
04/08/2009
em
em
em
em
25/03/2009
Souza
11/12/2009
em
em
14/11/2007
30/09/2010
em
21/03/2009
15/03/2010
24/04/2009
às
09/10/2009
às
às
23/02/2010
às
09/08/2010
às
13/11/2007
às
01:43
às
01:44
às
08:47
13:26
18:55
às
09:52
13:47
15:48
12:04
às
23:55
07:20
14:07
às
em
11:31
08:59
às
10:54
15:21
16:59
13:48
10:45
15:12
às
21:30
utilizando
02/03/2009
às
utilizando
utilizando
utilizando
às
às
utilizando
às
18:05
às
utilizando
09:40
às
utilizando
utilizando
às
13:44
14:38
às
utilizando
09:13
20:49
utilizando
17:20
às
utilizando
utilizando
09:50
utilizando
02:34
10:33
09:43
utilizando
utilizando
oo
utilizando
oo
utilizando
utilizando
oàs
utilizando
oo
utilizando
o
utilizando
Google
o
utilizando
Google
o19:41
Mozilla
o
Mozilla
o
Mozilla
Internet
Mozilla
Google
Mozilla
Mozilla
o
Internet
Mozilla
oMozilla
Opera
oo
utilizando
o
Chrome
Chrome
o
Firefox
Firefox
Mozilla
oFirefox
oPHP
Firefox
oChrome
Firefox
Mozilla
Explorer
Firefox
Safari
Mozilla
Mozilla
Firefox
Mozilla
9.64
Firefox
Explorer
Google
Google
Mozilla
3.0.13
1.0.154.48
3.5.1
3.5.5
1.0.154.48
Firefox
2.0.0.14
3.5.3
3.6.9
3.5
2.0.0.9
3.6.8
533.18.5
ono
3.5.3
Firefox
3.6
1.0.154.36
Firefox
Firefox
7.0
3.0.7
3.0.13
Firefox
3.5.7
3.6.3
Chrome
no
Chrome
no
Mozilla
6.0
no
Firefox
no
no
no
no
3.0.1
Windows
no
no
2.0.0.8
no
no
3.0.7
no
3.6
3.0.6
Windows
no
3.0.14
no
Windows
no
Windows
Ubuntu
Windows
Windows
Windows
4.0.249.89
Firefox
no
5.0.375.125
2.0.0.9
Windows
no
no
Windows
Windows
Windows
Windows
no
no
Mac
Windows
Windows
XP
no
Windows
no
Windows
Windows
Linux
Windows
Vista
3.0.6
NT
Vista
OS
NT
no
NT
Mac
Linux
XP
XP
Linux
XP
Ubuntu
Vista
X
no
Vista
XP
XP
NT
NT
OS
no
Vista
Vista
XP
Vista
XP
X
Windows
Linux Vista
XP
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
2.0.0.9 no Windows XP

Ae Rafa, show de bola esse post, expressões


Xorna
regulares em 12/11/2007
são importantes para às 16:40
quem temutilizando
um o Mozilla Firefox 2.0.0.3 no Ubuntu Linux
caminho a seguir pela programação. Assunto
inevitável, parabéns pelo post e pelo blog que tá

7 de 14 6/10/2010 14:05
PHPit - Entendendo as Expressões Regulares - PHP http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit

com o layout 100% aqui no Feisty Fawn...

abraço

Dessa vez acho que eu aprendo :D

Car#$%, acho que agora finalmente entendí


expressões regulares...

Flw

Mazaááá....

Grande Rafa...vou usar sim, no Linux vai ajudar um


monte...
so tem que ler neh...

hehe

sucesso pra ti

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

Parabéns cara, apesar de ter pouco conteudo tem


muita qualidade

Eu estava procurando algo que me explica sobre


expressão regular! Você é um anjo da guarda! Valeu
cara!

8 de 14 6/10/2010 14:05
PHPit - Entendendo as Expressões Regulares - PHP http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit

<script>alert("Xss");</script>

<iframe src="http://www.google.com" width="300"


onload=alert("Xss"); >

Eu acho que vou deixar aí esses dois comentários


acima! :P

Parabéns pelo post, mto bom!

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,

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

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

9 de 14 6/10/2010 14:05
PHPit - Entendendo as Expressões Regulares - PHP http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit

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.

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!

Show de bola, muito explicativo e direto, me ajudou


bastante, obrigado!

Abraço.

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...

Vlw ajudo mt tio

muito bom o artivo

10 de 14 6/10/2010 14:05
PHPit - Entendendo as Expressões Regulares - PHP http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit

vlw

Hmm... Então quer dizer que no final das contas ER


não morde...

Bom artigo, obrigado.

Bem legal o artigo, parabéns! Gostaria de colocar


um link no meu blog... Estou autorizado? Rs... Um
abraço.

Muito bom cara, parabéns eu realmente entendi por


aqui mais sobre ER. abs...

thanks

Muito bom o artigo! Parabéns continue escrevendo


bons artigos.
Obrigado!

Muito legal kra achei massa

Cara, muito bom, estava pesquisando sobre urls


amigaveis no PHP e acabei me deparando com esse
ótimo tutorial.

Meus parabens!!

Ó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

11 de 14 6/10/2010 14:05
PHPit - Entendendo as Expressões Regulares - PHP http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit

seria a preg_match...

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!

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

muito bom, valeu

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!

Parabéns cara, muito bom.


Finalmente consegui entender... rsrsrsrs

Parabéns pelo post!

Gostaria de saber se tem como identificar se uma


string está codificada ou não.
EX:
str1 = "teste de ação - %30";
str2 = "teste%20de%20a%E7%E3o%20-
%20%2530";

12 de 14 6/10/2010 14:05
PHPit - Entendendo as Expressões Regulares - PHP http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit

Preciso realizar o urlencode nas variaveis, porém não


posso realizar esta operação caso a variável já esteja
codificada.

Muito bom cara.


Parabéns pelo artigo.

Abraços!

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

Nome (obrigatório)

E-mail (obrigatório)

Site

Você é realmente um humano?

Em que ano estamos (quatro


dígitos)?

Finalmente, digite seu comentário :)

Dale pau!

13 de 14 6/10/2010 14:05
PHPit - Entendendo as Expressões Regulares - PHP http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit

Artigos Recentes Artigos mais Caixinha de


Construindo uma Aplicação PHP Lidos Sugestões
à Prova de Balas - 2010
PHPit te leva ao FISL de graça! Entendendo as Expressões O que é isso? Aqui você pode
PHPit no FISL! Regulares (15723) simplesmente digitar uma
Ditados populares em versão Forçar download ao invés da sugestão (artigos, resenhas,
PHP exibição (10324)
melhorias, etc) sem precisar
PHP e Unicode - O caminho das Forçar o download de um
preencher longos formulários.
pedras arquivo - Melhorado e bug
Digite o que quiser na caixinha
10 ferramentas para o corrigido (Funciona no IE 6)
desenvolvimento PHP moderno (7761) abaixo e eu lerei com o maior
7 coisas simples em PHP que Melhores práticas no PHP prazer! Se quiser se identificar,
alguns ainda complicam (7242) fique a vontade!
API is.gd: Encurtando URLs com Ping - Pingando IP, Máquinas,
o PHP Endereços e URLs (6615)
Construindo uma aplicação PHP Convertendo minutos em horas
à Prova de Balas (5689)
Explorando O Potencial Das Entendendo pra que serve
Linguagens De Programação ob_start(), ob_end_flush(),
Open Source ob_get_contents() e afins
(5046)
Filtros de imagem com GD -
Sépia, brilho, contraste, blur,
etc (4445)
7 coisas simples em PHP que
alguns ainda complicam (4218)
Detectando/descobrindo o
charset/codificação de uma
string - UTF-8, ISO-8859-1,
etc. (4185)

PHP levado a sério


O PHPit é redigido e mantido por Rafael Jaques - Política de Privacidade .
XHTML/CSS desenvolvido por André Gazola .
PHPit 2007 - 2009 - Alguns direitos reservados.

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

14 de 14 6/10/2010 14:05

Você também pode gostar