Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Validar CPF em PHP (Completo)
<?php
function validaCPF($cpf) {
// Extrai somente os números
$cpf = preg_replace( '/[^0-9]/is', '', $cpf );
// Verifica se foi informado todos os digitos corretamente
if (strlen($cpf) != 11) {
return false;
}
// Verifica se foi informada uma sequência de digitos repetidos. Ex: 111.111.111-11
if (preg_match('/(\d)\1{10}/', $cpf)) {
return false;
}
// Faz o calculo para validar o CPF
for ($t = 9; $t < 11; $t++) {
for ($d = 0, $c = 0; $c < $t; $c++) {
$d += $cpf[$c] * (($t + 1) - $c);
}
$d = ((10 * $d) % 11) % 10;
if ($cpf[$c] != $d) {
return false;
}
}
return true;
}
@rafael-neri
Copy link
Author

rafael-neri commented Mar 30, 2020

@Bruno-Bruce vou te passar um link com mais detalhes sobre a regra que há por trás da validação do CPF.

http://www.macoratti.net/alg_cpf.htm

@edem-fernando
Copy link

edem-fernando commented May 13, 2020

Muito bom cara, código bem menor e mais simples, porém correto. Maioria das validações de CPF que tem por aí são em uma função com código bem grande

@welingtonfidelis
Copy link

welingtonfidelis commented May 18, 2020

Vlw meu chefe =)

@jonasbraga
Copy link

jonasbraga commented Jun 16, 2020

A partir do PHP 7.4, as chaves { } utilizadas para acessar o elemento da string foram descontinuadas, assim este codigo irá resultar em um parse error. A solução é trocar as chaves para colchetes { } => [ ]. Segue exemplo abaixo com as modificações:

function validaCPF($cpf) { 
    // Extrai somente os números
    $cpf = preg_replace( '/[^0-9]/is', '', $cpf );
     
    // Verifica se foi informado todos os digitos corretamente
    if (strlen($cpf) != 11) {
        return false;
    }

    // Verifica se foi informada uma sequência de digitos repetidos. Ex: 111.111.111-11
    if (preg_match('/(\d)\1{10}/', $cpf)) {
        return false;
    }

    // Faz o calculo para validar o CPF
    for ($t = 9; $t < 11; $t++) {
        for ($d = 0, $c = 0; $c < $t; $c++) {
            $d += $cpf[$c] * (($t + 1) - $c);
        }
        $d = ((10 * $d) % 11) % 10;
        if ($cpf[$c] != $d) {
            return false;
        }
    }
    return true;
}

@rafael-neri
Copy link
Author

rafael-neri commented Jun 17, 2020

@jonasbraga obrigado pela dica. Código atualizado.

@heliogit
Copy link

heliogit commented Jan 19, 2021

Oi Rafael, blz?
Gostaria de aplicar essa validação em um campo de entrada do formulário de registro (uso o plugin User Registration / Wordpress), através do plugin Snippets (Wordpress). Você tem idéia de como fazer? Obrigado!

@rafael-neri
Copy link
Author

rafael-neri commented Jan 27, 2021

@heliogit em relação ao Wordpress eu não tenho como te ajudar, infelizmente.

@RodsFer25
Copy link

RodsFer25 commented Feb 11, 2021

Ele verifica a existência ou não do cpf?

@rafael-neri
Copy link
Author

rafael-neri commented Feb 11, 2021

@RodsFer25 ele verifica se é um CPF válido de acordo com as regras de validação de CPF.
Há uma documentação explicando essas regras.
Já a existência de fato do CPF não é feita pois algo assim somente a Receita Federal pode determinar.

Resumindo: APENAS VERIFICA SE É VÁLIDO.

@RodsFer25
Copy link

RodsFer25 commented Feb 11, 2021

Entendi. No caso, mesmo que eu coloque um CPF inexistente, ele não acusará erro, certo?

@WernerLuiz92
Copy link

WernerLuiz92 commented Feb 24, 2021

Show Muito TOP

@pferreirafabricio
Copy link

pferreirafabricio commented Mar 11, 2021

Muito obrigado!

@narcisspicpay
Copy link

narcisspicpay commented Mar 12, 2021

Ótima solução! Obrigado por compartilhar e parabéns!

@rafael-neri
Copy link
Author

rafael-neri commented Mar 12, 2021

@KaliaryCisne
Copy link

KaliaryCisne commented Apr 9, 2021

Excelente código Rafael, parabéns!

@pablowkl
Copy link

pablowkl commented Apr 14, 2021

Muito bom! valeeu

@kelwenjs
Copy link

kelwenjs commented May 13, 2021

God! A parte dos números repetidos é que eu estava procurando se alguém já tinha feito em preg_match. Apesar de só implementar essa parte, deixarei os louváveis kudos nos comments do script haha. Muito obrigado.

@WellingtonFonseca
Copy link

WellingtonFonseca commented Jun 16, 2021

Muito bom e simples!

@rafael-neri
Copy link
Author

rafael-neri commented Jun 19, 2021

@queliom eu fiz o teste com o CPF 566.932.570-20 e está funcionando corretamente.
A função foi feita seguindo a documentação contendo a regra de validação de CPF.

@queliom
Copy link

queliom commented Jun 19, 2021

@rafael-neri Sim, foi um equívoco. Por isso apaguei o comentário. Perdão 😅

@matheuslipk
Copy link

matheuslipk commented Nov 14, 2021

@rafael-neri Obrigado man!

@marcomurta1402
Copy link

marcomurta1402 commented Dec 21, 2021

Olá, @rafael-neri. Você já testou essa validação com o WP Forms (plugin de formulários para WordPress)?

Sabe dizer se funciona?

Como seria a implementação, nesse caso?

@rafael-neri
Copy link
Author

rafael-neri commented Dec 22, 2021

@marcomurta1402 eu não uso wordpress então não sei dizer como seria a implementação.

Mas se esse plugin de formulários permitir adicionar validações em PHP então sim funcionaria.

@marcomurta1402
Copy link

marcomurta1402 commented Dec 22, 2021

@rafael-neri eu vou testar e se rolar eu respondo aqui. Valeu!

@rafael-neri
Copy link
Author

rafael-neri commented Dec 29, 2021

@marcomurta1402 se conseguiu usar o validador dentro do wordpress, cria um gist e deixa o link aqui.
Será de grande ajuda caso alguém mais precise usar.

@sr-adulis
Copy link

sr-adulis commented Jan 5, 2022

@rafael-neri Esbarrei no mesmo problema no wordpress, estou usando o plugin do Cláudio pra validação final de CPF, mas fiz esse código em javascript pra uma validação assim que o campo dispara a ação Blur e usei o código da receita pr validar o CPF:

Incluir código no Footer, não no header.

<script>
  const constCPF= document.getElementById('cpf');
  const form = document.getElementById('checkout_form');

  constCPF.addEventListener("focus", function(event){
    event.target.style.background = "white"
  }, true);

  constCPF.addEventListener("blur", function(event){
    var string = document.getElementById('cpf').value;
    var strCPF =  string.replace('.','').replace('-','').replace('.','') ;
    
    if (TestaCPF(strCPF)!=true){
      alert("CPF inválido")
      event.target.style.background = "#ff00007a"
    }else{
      event.target.style.background = "#00b6ff29"
    }
  }, true);

  function TestaCPF(strCPF) {
    var Soma;
    var Resto;
    Soma = 0;
  
    if (strCPF == "00000000000") return false;

    for (i=1; i<=9; i++) Soma = Soma + parseInt(strCPF.substring(i-1, i)) * (11 - i);
    
    Resto = (Soma * 10) % 11;

    if ((Resto == 10) || (Resto == 11))  Resto = 0;
    if (Resto != parseInt(strCPF.substring(9, 10)) ) return false;

    Soma = 0;
    for (i = 1; i <= 10; i++) Soma = Soma + parseInt(strCPF.substring(i-1, i)) * (12 - i);
    Resto = (Soma * 10) % 11;

    if ((Resto == 10) || (Resto == 11))  Resto = 0;
    if (Resto != parseInt(strCPF.substring(10, 11) ) ) return false;
    return true;
  }

</script>

usei no footer, Ele deixa o campo Azul quando validado, e quando digitar um CPF invalido o campo fica vermelho e um alerta aparece na tela informando o usuário do erro.

Links de fontes dos códigos e lógicas usadas:

Verificação do CPF: https://www.devmedia.com.br/validar-cpf-com-javascript/23916
Outras discução do mesmo problema:https://wordpress.org/support/topic/problemas-com-validacao-do-cpf/
Pluggin do claudio:https://github.com/claudiosanches/woocommerce-extra-checkout-fields-for-brazil
Código de event trigger pra focus e blur:https://www.youtube.com/watch?v=kXq6tO5fqnU
Remoção de caracteres especiais do texto: https://pt.stackoverflow.com/questions/345075/como-receber-o-n%C3%BAmero-de-cpf-e-formatar-para-ficar-sem-os-pontos-e-tra%C3%A7oinput-m

@rafael-neri
Copy link
Author

rafael-neri commented Jan 5, 2022

@sr-adulis e demais:
Para a utilização no Front, eu recomendo o uso de uma Lib chamada js-brasil com validações brasileiras.
Segue abaixo um exemplo simples com JQuery.

<input type="text" id="cpf"/>

<script src="https://cdn.jsdelivr.net/npm/js-brasil/js-brasil.js"></script>
<script>
  $("#cpf").on("blur", function(){
      let cpf_value = $(this).val();
    
      if(jsbrasil.validateBr.cpf(cpf_value)) {
          alert("CPF Válido");
      } else {
    	  alert("CPF inválido")
      }
  });
</script>

Para testar o código acima: https://jsfiddle.net/d6ncju1f/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment