Verificar se o CPF é válido

Publicado por Renan Martins Pimentel em 21/11/2011

[ Hits: 32.941 ]

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

Autenticação e criptografia de senhas usando PHP

Cadastrar eventos/compromissos no Google Agenda com cURL [PHP]

Mostrar a previsão do tempo com PHP

Leitura recomendada

Instalação fácil do Netbeans no Ubuntu

Migração de sistema... Porque deu errado?

Capte rádios online via terminal Linux

Dois Monitores no Ubuntu

Gerando relatórios do PosgreSQL usando o PgFouine

  

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