Verificar se o CPF é válido

Publicado por Renan Martins Pimentel em 21/11/2011

[ Hits: 32.713 ]

Blog: http://www.renanmpimentel.com.br

 


Verificar se o CPF é válido



Vamos fazer uma função em PHP, que vai retornar se determinado CPF é válido ou não. Mas antes disso, vamos entender como é feito este cálculo.

Como é feito o cálculo do CPF

O CPF é formado por 11 números, e os dois últimos números são os dígitos verificadores. Vamos criar aqui um número qualquer: 555.444.333-89, neste exemplo os dígitos verificadores são 8 e 9.

Vamos testar:

    5×10 = 50
    5×9 = 45
    5×8 = 40
    4×7 = 35
    4×6 = 24
    4×5 = 20
    3×4 = 16
    3×3 =  9
    3×2 =  6

____________
Total = 245

Agora Vamos a alguns cálculos para verificarmos o primeiro dígito.

Dividiremos o total das multiplicações dos números do CPF que foi feita acima (245) por 11, ficando assim:

245 / 11 = 22

Você pode está pensando, porque 22, poderia ser 21 também, vamos explicar:

- Para o cálculo dar certo, precisamos de divisões que sejam exatas ou tenham sobras de números, e não de falta de números.

Exemplo : Usando o processo reverso da divisão (ou seja, a multiplicação) se fosse 21 o resultado da questão, ficaria assim:

245 / 11 = 21

Mas: 21 * 11 = 231

Sendo assim, faltariam números pois o nosso número alvo é 245, e o resultado foi 231 que é menor, e nosso objetivo é que tenha sobra de números e não a falta de números. Já usando o 22, o resultado ficaria:

245 / 11 = 22

Exemplo : 22 * 11 = 242 (sendo assim, teríamos sobra de números que no caso é 8)

Agora é só usar a sobra ( 8 ) e subtrair por 11, ficando assim:

11 - 8 = 3

Agora que encontramos o Primeiro Dígito (que é 3), já descobrimos que o CPF exemplificado é um CPF inválido, pois o primeiro digito é 3 e não o número 8.

Função em PHP

function verificar_cpf($val) { $cpf = str_replace('-', '', str_replace('.', '', $val)); if (!is_numeric($cpf)) { $status = false; } else { if (($cpf == '11111111111') || ($cpf == '22222222222') || ($cpf == '33333333333') || ($cpf == '44444444444') || ($cpf == '55555555555') || ($cpf == '66666666666') || ($cpf == '77777777777') || ($cpf == '88888888888') || ($cpf == '99999999999') || ($cpf == '00000000000')) { $status = false; } else { $dv_informado = substr($cpf, 9, 2); for ($i = 0; $i <= 8; $i++) { $digito[$i] = substr($cpf, $i, 1); } $posicao = 10; $soma = 0; for ($i = 0; $i <= 8; $i++) { $soma = $soma + $digito[$i] * $posicao; $posicao = $posicao - 1; } $digito[9] = $soma % 11; if ($digito[9] < 2) { $digito[9] = 0; } else { $digito[9] = 11 - $digito[9]; } $posicao = 11; $soma = 0; for ($i = 0; $i <= 9; $i++) { $soma = $soma + $digito[$i] * $posicao; $posicao = $posicao - 1; } $digito[10] = $soma % 11; if ($digito[10] < 2) { $digito[10] = 0; } else { $digito[10] = 11 - $digito[10]; } $dv = $digito[9] * 10 + $digito[10]; if ($dv != $dv_informado) { $status = false; } else $status = true; } } return $status; }

Depois disso, vamos puxar a informação:

verificar_cpf($cpf)

E para quem quiser ver, aqui tem uma demonstração online: http://www.renanmpimentel.com.br/exemplos/validar-cpf

Outras dicas deste autor

Gerando QR Code com PHP

Upload de várias imagens com PHP e jQuery

Fullscreen com jQuery e CSS

Mostrar a previsão do tempo com PHP

Autenticação e criptografia de senhas usando PHP

Leitura recomendada

Instalando driver nvidia no OpenSuSE Linux

Aplicar temas no LXDE

Monitor externo no seu notebook com Ubuntu

Instalando PostgreSQL no Slackware Linux

Vídeo-aulas básicas do Ubuntu 9.10

  

Comentários
[1] Comentário enviado por flyren em 21/11/2011 - 11:12h

245 - 242 = 3
11 - 3 = 8


O PRIMEIRO DIGITO TÁ CERTO!!!!!!
O SEGUNDO DIGITO QUE TÁ ERRADO!!!!!

[2] Comentário enviado por flyren em 21/11/2011 - 11:15h

O CPF válido seria 555.444.333-80

[3] Comentário enviado por renanmpimentel em 21/11/2011 - 11:17h

Sim, esse numero que você passou é válido.

[4] Comentário enviado por johnpisces em 09/02/2012 - 16:48h

Desde quando a multiplicação de 4 x 7 dá 35 ?



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts