Nenhum produto encontrado nessa seleção.
Quando criamos formulários online, a maioria dos campos têm um tipo de validação específica, datas, números, emails, URLs… e demais. Porém, alguns deles precisam de um cuidado especial.
Nesse artigo, vou mostrar como fazer o cálculo para validar CPF com PHP, manualmente, ou até no Excel, se preferir. Ao final do artigo você pode baixar os arquivos gerados ao decorrer do texto.
A tabelinha do Excel também faz o cálculo exatamente conforme descrito no artigo.
Você pode testar uma demonstração da validação de CPF com PHP nos links abaixo:
Então vamos aprender como fazer para validar CPF com PHP.
Algoritmo do CPF
Para validar qualquer CPF, precisamos realizar um cálculo grande, porém, relativamente simples.
Vamos simular um número de CPF qualquer: 361.059.427-61 (este CPF não existe na base de dados da receita federal, mas ainda é válido).
Para realizar o cálculo, primeiramente capturamos os 9 primeiros números do CPF sem ponto ou nem traço, só números:
361059427
Agora temos multiplicar cada um dos números do CPF por uma sequencia regressiva começando de 10 até 2 (10, 9, 8, 7, 6… 2). Exemplo:
3 x 10 = 30 6 x 9 = 54 1 x 8 = 8 0 x 7 = 0 5 x 6 = 30 9 x 5 = 45 4 x 4 = 16 2 x 3 = 6 7 x 2 = 14
Veja o mesmo exemplo em uma planilha do Excel:
O próximo passo é fazer a soma do resultado de todos os cálculos, ou seja:
30 + 54 + 8 + 0 + 30 + 45 + 16 + 6 + 14 = 203
Agora temos que pegar o valor total da conta acima, e dividir por 11. Porém, ao invés de capturar o valor gerado, vamos precisar do resto da divisão.
Para fazer isso na calculadora podemos fazer o seguinte:
- Faça a divisão normal: 203 / 11 = 18,454545454545454545454545454545;
- Se o valor for inteiro, o resto é zero (0); se tiver decimais, multiplique as partes decimais por 11. Exemplo: 0,454545454545454545454545454545 * 11 = 4,999999999999999999999999999995.
- Arredonde o valor do resto da divisão para o número mais próximo. Em nosso caso, 4.9, é 5. Cinco é o resto da divisão entre 203 e 11.
Caso o resto da divisão acima seja menor do que 2, o primeiro dígito verificador do CPF se torna 0 (zero); se não for, subtraímos o valor obtido de 11.
Para nosso exemplo: 11 – 5 = 6.
Seis (6) é o primeiro dígito do nosso CPF, portanto, já temos a seguinte parte dos números:
3610594276
Isso é a junção dos primeiros números do CPF, com o dígito encontrado nas contas acima.
Agora tenho duas notícias pra você: uma boa; outra ruim. A boa é que se você aprendeu, não terá dificuldades na próxima conta; a ruim é que você vai precisar fazer tudo novamente, no entanto, agora incluindo o primeiro dígito que encontramos anteriormente.
Para que isso aconteça, precisaremos multiplicar cada um dos primeiros nove números do CPF, com o primeiro dígito (10 números no total – 361.059.427-6), por uma sequencia regressiva começando de 11.
3 x 11 = 33 6 x 10 = 60 1 x 9 = 9 0 x 8 = 0 5 x 7 = 35 9 x 6 = 54 4 x 5 = 20 2 x 4 = 8 7 x 3 = 21 6 x 2 = 12 (Primeiro Dígito)
Veja o mesmo exemplo acima, agora em uma tabela do Excel:
Agora é o mesmo processo, a soma do resultado de todos os cálculos acima, ou seja:
33 + 60 + 9 + 0 + 35 + 54 + 20 + 8 + 21 + 12 = 252
Vamos pegar o resto da divisão entre 252 e 11:
252 % 11 = 10;
Caso o resto da divisão acima seja menor do que 2, o segundo dígito verificador do CPF se torna 0 (zero); se não for, subtraímos o valor obtido de 11.
11 - 10 = 1;
Um (1) é o último (ou segundo) dígito do nosso CPF, portanto, 361.059.427-61 é um CPF válido.
Agora vamos ver como fazer isso tudo em PHP.
Como validar CPF com PHP
Para validar o CPF com PHP, vamos fazer tudo dentro de uma função:
function valida_cpf( $cpf = false ) { }
O parâmetro $cpf será uma string, ou seja, o CPF poderá ser enviado em qualquer formato (com ou sem pontos e traço).
Se você analisar a conta que realizamos anteriormente, perceberá que ela deve ser feita duas vezes (uma para o primeiro, outra para o segundo dígito do CPF).
Por isso, podemos criar uma função para fazer essa conta:
function calc_digitos_posicoes( $digitos, $posicoes = 10, $soma_digitos = 0 ) { // Faz a soma dos dígitos com a posição // Ex. para 10 posições: // 0 2 5 4 6 2 8 8 4 // x10 x9 x8 x7 x6 x5 x4 x3 x2 // 0 + 18 + 40 + 28 + 36 + 10 + 32 + 24 + 8 = 196 for ( $i = 0; $i < strlen( $digitos ); $i++ ) { $soma_digitos = $soma_digitos + ( $digitos[$i] * $posicoes ); $posicoes--; } // Captura o resto da divisão entre $soma_digitos dividido por 11 // Ex.: 196 % 11 = 9 $soma_digitos = $soma_digitos % 11; // Verifica se $soma_digitos é menor que 2 if ( $soma_digitos < 2 ) { // $soma_digitos agora será zero $soma_digitos = 0; } else { // Se for maior que 2, o resultado é 11 menos $soma_digitos // Ex.: 11 - 9 = 2 // Nosso dígito procurado é 2 $soma_digitos = 11 - $soma_digitos; } // Concatena mais um dígito aos primeiro nove dígitos // Ex.: 025462884 + 2 = 0254628842 $cpf = $digitos . $soma_digitos; // Retorna return $cpf; }
A função acima faz o que precisamos, ou seja, multiplica cada um dos números do CPF por uma sequencia regressiva começando de uma posição definida.
Agora podemos verificar os campos do CPF enviado para a função:
// Verifica se o CPF foi enviado if ( ! $cpf ) { return false; } // Remove tudo que não é número do CPF // Ex.: 025.462.884-23 = 02546288423 $cpf = preg_replace( '/[^0-9]/is', '', $cpf ); // Verifica se o CPF tem 11 caracteres // Ex.: 02546288423 = 11 números if ( strlen( $cpf ) != 11 ) { return false; } // Captura os 9 primeiros dígitos do CPF // Ex.: 02546288423 = 025462884 $digitos = substr($cpf, 0, 9);
As verificações são simples, leia os comentários do código que você vai entender.
Para dar sequência, temos que criar um novo CPF baseado nos primeiros números. Isso vai gerar o primeiro dígito.
// Faz o cálculo dos 9 primeiros dígitos do CPF para obter o primeiro dígito $novo_cpf = calc_digitos_posicoes( $digitos );
Agora vamos fazer o mesmo, porém, as posições de cálculo vão começar no número 11.
// Faz o cálculo dos 10 dígitos do CPF para obter o último dígito $novo_cpf = calc_digitos_posicoes( $novo_cpf, 11 );
Nesse ponto, teremos um novo CPF. Esse novo CPF gerado deverá ser idêntico ao CPF enviado para a função.
Para fazer essa verificação em PHP, basta fazer o seguinte:
// Verifica se o novo CPF gerado é idêntico ao CPF enviado if ( $novo_cpf === $cpf ) { // CPF válido return true; } else { // CPF inválido return false; }
Se a função retornar um valor verdadeiro (true), o CPF é válido; se for falso (false), o CPF está incorreto.
Função completa: Valida CPF com PHP
Se você se perdeu no caminho, segue a função para validar CPF completa:
<?php /** * Valida CPF * * @author Luiz Otávio Miranda <[email protected]/w> * @param string $cpf O CPF com ou sem pontos e traço * @return bool True para CPF correto - False para CPF incorreto * */ function valida_cpf( $cpf = false ) { // Exemplo de CPF: 025.462.884-23 /** * Multiplica dígitos vezes posições * * @param string $digitos Os digitos desejados * @param int $posicoes A posição que vai iniciar a regressão * @param int $soma_digitos A soma das multiplicações entre posições e dígitos * @return int Os dígitos enviados concatenados com o último dígito * */ if ( ! function_exists('calc_digitos_posicoes') ) { function calc_digitos_posicoes( $digitos, $posicoes = 10, $soma_digitos = 0 ) { // Faz a soma dos dígitos com a posição // Ex. para 10 posições: // 0 2 5 4 6 2 8 8 4 // x10 x9 x8 x7 x6 x5 x4 x3 x2 // 0 + 18 + 40 + 28 + 36 + 10 + 32 + 24 + 8 = 196 for ( $i = 0; $i < strlen( $digitos ); $i++ ) { $soma_digitos = $soma_digitos + ( $digitos[$i] * $posicoes ); $posicoes--; } // Captura o resto da divisão entre $soma_digitos dividido por 11 // Ex.: 196 % 11 = 9 $soma_digitos = $soma_digitos % 11; // Verifica se $soma_digitos é menor que 2 if ( $soma_digitos < 2 ) { // $soma_digitos agora será zero $soma_digitos = 0; } else { // Se for maior que 2, o resultado é 11 menos $soma_digitos // Ex.: 11 - 9 = 2 // Nosso dígito procurado é 2 $soma_digitos = 11 - $soma_digitos; } // Concatena mais um dígito aos primeiro nove dígitos // Ex.: 025462884 + 2 = 0254628842 $cpf = $digitos . $soma_digitos; // Retorna return $cpf; } } // Verifica se o CPF foi enviado if ( ! $cpf ) { return false; } // Remove tudo que não é número do CPF // Ex.: 025.462.884-23 = 02546288423 $cpf = preg_replace( '/[^0-9]/is', '', $cpf ); // Verifica se o CPF tem 11 caracteres // Ex.: 02546288423 = 11 números if ( strlen( $cpf ) != 11 ) { return false; } // Captura os 9 primeiros dígitos do CPF // Ex.: 02546288423 = 025462884 $digitos = substr($cpf, 0, 9); // Faz o cálculo dos 9 primeiros dígitos do CPF para obter o primeiro dígito $novo_cpf = calc_digitos_posicoes( $digitos ); // Faz o cálculo dos 10 dígitos do CPF para obter o último dígito $novo_cpf = calc_digitos_posicoes( $novo_cpf, 11 ); // Verifica se o novo CPF gerado é idêntico ao CPF enviado if ( $novo_cpf === $cpf ) { // CPF válido return true; } else { // CPF inválido return false; } }
Se quiser, você pode baixar este arquivo logo abaixo.
Download: Função valida CPF com PHP
Você pode baixar a função descrita neste artigo utilizando o link abaixo:
Para utilizá-la, basta incluir o arquivo valida-cpf.php e chamar a função em uma estrutura condicional:
<?php // Inclui o arquivo com a função valida_cpf include('valida-cpf.php'); // Verifica o CPF if ( valida_cpf( '470.392.165-07' ) ) { echo "CPF é válido."; } else { echo "CPF Inválido."; }
Simples assim!
No excel
Se quiser utilizar o Excel para gerar os dois últimos dígitos de um CPF para qualquer número (ou seja, gerar um CPF), basta fazer o download da planilha abaixo:
Espero ter ajudado.