Validar com Expressões Regulares no PHP

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.

Veja também:

15 comentários

  1. 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})$

    • 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”;

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

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

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>