Nesse artigo irei falar um pouco sobre as poderosas expressões relulares no PHP. Meu objetivo aqui não é ensinar sobre elas, mas sim falar como elas podem ser úteis para validação de dados.
1. Email
Em muitos casos temos que validar se o usuário preencheu corretamente o campo “email” com um email válido, para isso podemos utilizar as expressões relugares:
<?php $email = "faelcalves@hotmail.com"; if (!eregi("^[a-z0-9_\.\-]+@[a-z0-9_\.\-]*[a-z0-9_\-]+\.[a-z]{2,4}$", $email)) { echo "Email inválido"; } ?> |
2. Data
Muito útil também é saber se as datas enviadas estão em formato correto, ou seja, DD/MM/AAA:
<?php // VALIDAR DATA NO FORMATO DD/MM/AAAA $data = "22/01/1991"; if (!eregi("^[0-9]{2}/[0-9]{2}/[0-9]{4}$", $data)) { echo "Data em formato inválido."; } ?> |
3. CEP
Em alguns casos temos que validar CEP, principalmente quando se trata de e-commerce:
<?php // VALIDAR CEP (XXXXX-XXX) $cep = "17052-150"; if (!eregi("^[0-9]{5}-[0-9]{3}$", $cep)) { echo "CEP inválido"; } ?> |
4. Telefone
Bom o telefone pode ser colocado de várias maneiras, vamos ver algumas delas:
<?php // VALIDAR TELEFONE NO SEGUINTE FORMATO: DDD33333333 $telefone = "01432363810"; if (!eregi("^[0-9]{11}$", $telefone)) { echo "Telefone inválido"; } ?> |
<?php // VALIDAR TELEFONE NO SEGUINTE FORMATO: 3333-3333 $telefone = "3236-3810"; if (!eregi("^[0-9]{4}-[0-9]{4}$", $telefone)) { echo "Telefone inválido"; } ?> |
<?php // VALIDAR TELEFONE NO SEGUINTE FORMATO: (DDD) 3333-3333 $telefone = "(014) 3236-3810"; if (!eregi("^\([0-9]{3}\) [0-9]{4}-[0-9]{4}$", $telefone)) { echo "Telefone inválido"; } ?> |
5. IP
Talvez não muito utilizado, porém em alguns casos temos que verificar de um endereço IP (IPv4) é válido, portanto utilizamos:
<?php $ip = "189.18.125.183"; if (!eregi("^([0-9]){1,3}.([0-9]){1,3}.([0-9]){1,3}.([0-9]){1,3}$", $ip)) { echo "IP Inválido"; } ?> |
6. URL
Validamos também se uma URL, ou seja, um endereço de site é válido (com http://):
<?php $url = "http://rafaelcouto.com.br"; if (!preg_match("|^http(s)?://[a-z0-9-]+(\.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i", $url)) { echo "URL inválida"; } ?> |
7. CPF
Bom essa não seria a melhor forma para validar um CPF, mais já ajuda, pelo menos em relação a pontuação:
<?php // VALIDAR CPF NO SEGUINTE FORMATO: XXX.XXX.XXX-XX $cpf = "111.444.777-35"; if (!eregi("^([0-9]){3}\.([0-9]){3}\.([0-9]){3}-([0-9]){2}$", $cpf)) { echo "CPF Inválido"; } ?> |
Podemos chegar a conclusão que com as Expressões Regulares é possível validar praticamente qualquer tipo de dado, esses são alguns exemplos, porém se você se aprofundar mais em Expressões Regulares poderá fazer muito mais. Caso você que saber mais sobre as Expressões Regulares, recomendo alguns tutoriais:
http://pmarote.net/conaplphp/tutorial1f.html
http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit
Boa sorte =D
Até mais.
Olá Faael!
Gostei do seu site..
Obrigado por ter colocad um link para o meu!
Um abraço e continue com o bom trabalho e com os bons artigos.
Um abraço
Olá, eu também fiz uma postagem sobre validação de email, só que usei um método muito funcional, que verifica se realmente o host existe.
http://www.gasparimsat.com/index.php/21/08/2009/validacao-do-email-pelo-host-usando-php/
Ex: A pessoa escreve email@bol.com.br, ele verifica se o host “Bol” existe.
A função eregi vai cair em desuso se der pra passar elas pra preg_match ^_^
Bom, Rafaael, na de validação de CPF, escape o “ponto” pois ele é um meta-caractere, sendo assim, a sua ER validaria 000$111X222-333 como correta, pois o ponto substitui um caractere qualquer. Faça assim, fica um pouco melhor:
^(([0-9]{3})\.){2}([0-9]{3})-([0-9]{2,3})$
Bom, na real, são só dois dígitos no final mesmo. Então:
^(([0-9]{3})\.){2}([0-9]{3})-([0-9]{2})
Olá Fernando,
Nem havia notado isso, obrigado por me corrigir.
Já escapei os pontos, mas vou deixar da forma que está, pois fica mais fácil a compreensão. De qualquer forma, a sua sugestão é muito boa.
Abraço.
FIZ ASSIM PARA VALIDAR CPF NO FORMATO: 000.000.000-00
EXEMPLO: *obs: \d substitui [0-9]
$cpf = “000.000.000-00″;
if (!preg_match(‘/^(\d{3}).(\d{3}).(\d{3})-(\d{2})$/’, $cpf)){
echo”formato de CPF invalido, digite assim: 000.000.000-00″;
}else echo”$cpf”;
Não sei se você permite código mas vai que alguem precisa validar um CPF de verdade usando os dígitos verificadores. Catei parte disso na web e fiz algumas correções.
<?php
function validar_cpf($strCPF)
{
// 11 dígitos ou mais!
if ( strlen($strCPF) < 11 ) return false;
// Retira . e - do CPF:
$strCPF = str_replace(".","", $strCPF);
$strCPF = str_replace("-","", $strCPF);
// Verifica se o CPF é constituído de números repetidos de 11111111111 até 99999999999
for($i = 0; $i <= 9; $i++ )
{
$strRepetido = "";
if ( $strCPF == str_pad($strRepetido, 11, $i) ) return false;
}
// Obtém o dígito verificador
$intDVInformado = substr($strCPF, 9,2);
for($i = 0; $i <= 8; $i++ )
{
$arDigito[$i] = substr($strCPF, $i, 1);
}
//Calcula o valor do 10º dígito de verificação
$intPosicao = 10;
$intSoma = 0;
for($i = 0; $i <= 8; $i++ )
{
$intSoma += ($arDigito[$i] * $intPosicao);
$intPosicao = $intPosicao - 1;
}
$arDigito[9] = $intSoma % 11;
$arDigito[9] = ($arDigito[9] < 2) ? 0 : 11 - $arDigito[9];
//Calcula o valor do 11º dígito de verificação
$intPosicao = 11;
$intSoma = 0;
for($i = 0; $i <= 9; $i++ )
{
$intSoma += $arDigito[$i] * $intPosicao;
$intPosicao = $intPosicao - 1;
}
$arDigito[10] = $intSoma % 11;
$arDigito[10] = ($arDigito[10]
Olá Murph,
Meu objetivo no artigo foi mostrar apenas as expressões regulares, claro que não substitui a validação do digito verificador.
Obrigado por compartilhar sua função conosco.
Abraço.
Testei e não funcionou a expressão regular de URL, foi só eu ou mais alguém não recebeu retorno válido pra essa regex??
Muito boa essas expressões regulares, eu criei uma validação mais generica para telefone:
/^(\(?[0-9]{2}\)?|[-. ]?)[-. ]?[0-9]{4}[-. ]?[0-9]{4}$/
Ela valida nos formatos:
xx xxxx xxxx, xx.xxxx.xxxx, xx-xxxx-xxxx
(xx) xxxx xxx, (xx).xxxx.xxx,(xx)-xxxx-xxx
xxxx xxxx, xxxx.xxxx, xxxx-xxxx
Tem um Validador PHP de Expressões Regulares on-line em:
http://www.delphiartigos.blogspot.com.br/
Obrigado por compartilhar.
Um outro, que é excelente, é esse aqui: http://regexpal.com/
Abraço.
Vlw mano!
Obrigado pelo incentivo
Muito bom também o PHPIt, ótimos artigos. E espero que os visitantes aqui possam conhece-lo também
Abraços.