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;
}
@augustocparaujo

This comment has been minimized.

Copy link

@augustocparaujo augustocparaujo commented Jan 9, 2018

testou?

@rafael-neri

This comment has been minimized.

Copy link
Owner Author

@rafael-neri rafael-neri commented Feb 6, 2018

@augustocparaujo sim, testei.
Fiz pra usar em um projeto.

@Wyru

This comment has been minimized.

Copy link

@Wyru Wyru commented Feb 16, 2018

Muito bom :)

@nicklleite

This comment has been minimized.

Copy link

@nicklleite nicklleite commented Feb 20, 2018

Com certeza a abordagem mais simples que eu já vi...

@RenanLazarotto

This comment has been minimized.

Copy link

@RenanLazarotto RenanLazarotto commented Jun 29, 2018

Facilitou muito na hora de validar CPF, adicionei ao meu sistema com mais algumas verificações internas e agora está perfeito. Obrigado!

@rodrigoalmeidanet

This comment has been minimized.

Copy link

@rodrigoalmeidanet rodrigoalmeidanet commented Nov 2, 2018

Funcioou bacana! Parabéns!

@alanrbentes

This comment has been minimized.

Copy link

@alanrbentes alanrbentes commented Jan 23, 2019

Código otimizado, excelente ! Vlu.

@israeldax

This comment has been minimized.

Copy link

@israeldax israeldax commented May 31, 2019

Obrigado por compartilhar!

@jonathangoncalves

This comment has been minimized.

Copy link

@jonathangoncalves jonathangoncalves commented Jul 1, 2019

<?php
/* Criando Interface para Exceptions */
interface ExceptionInterface {
}

/* Criando Exception exclusiva para CPF. Ajuda muito a descobrir o tipo da Exception */
class InvalidCpfException extends \InvalidArgumentException implements ExceptionInterface
{

}

class Cpf
{
    private $cpf;

    /**
     * Cpf constructor.
     * @param string $cpf
     */
    public function __construct($cpf)
    {
        if ($this->validate($cpf) === false) {
            throw new InvalidCpfException;
        }
        return $this->cpf = $cpf;
    }

    public function __toString()
    {
        return $this->cpf;
    }

    private function validate($cpf)
    {

        // Extrair 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;
    }
}

//chamada de exemplo:

try{
    $cpf = new Cpf('123.456.789-10');

echo $cpf;
} catch(InvalidCpfException $e){
echo "cpf invalido";
} catch (Exception $e){
echo "Erro Inesperado";
}
@rafael-neri

This comment has been minimized.

Copy link
Owner Author

@rafael-neri rafael-neri commented Jul 1, 2019

@jonathangoncalves, ficou bem bacana.

@rogerionunes

This comment has been minimized.

Copy link

@rogerionunes rogerionunes commented Aug 28, 2019

Show! Valeu!

@softkleen

This comment has been minimized.

Copy link

@softkleen softkleen commented Sep 19, 2019

obrigado!

@ghost

This comment has been minimized.

Copy link

@ghost ghost commented Oct 24, 2019

O senhor esta de parabens meu garoto

@rhaymisonbetini

This comment has been minimized.

Copy link

@rhaymisonbetini rhaymisonbetini commented Nov 19, 2019

show de bola meu garoto

@guifavere

This comment has been minimized.

Copy link

@guifavere guifavere commented Nov 28, 2019

Parabéns pelo script, amigo.
Só uma sugestão, você pode fazer a checagem da quantidade de caracteres, e também da repetição deles, dentro de um único if:

<?php
function validaCPF($cpf) {
    if (strlen($value) !== 11 || preg_match('/(\d)\1{10}/', $value)) {
        return false;
    }

    for ($t = 9; $t < 11; $t++) {
        for ($d = 0, $c = 0; $c < $t; $c++) {
            $d += $value{$c} * (($t + 1) - $c);
        }

        $d = ((10 * $d) % 11) % 10;

        if ($value{$c} != $d) {
            return false;
        }
    }

    return true;
}

Abraços

@rafael-neri

This comment has been minimized.

Copy link
Owner Author

@rafael-neri rafael-neri commented Nov 28, 2019

@GuilhermeFavere obrigado pela dica.
Há inúmeras maneiras de deixar o código reduzido, por enquanto vou manter assim pois fica mais didático.
Mas sua sugestão foi boa.

@Bruno-Bruce

This comment has been minimized.

Copy link

@Bruno-Bruce Bruno-Bruce commented Mar 30, 2020

Boa tarde,

Gostaria de ajude nessa parte do código:
// 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;
}

Sou novato em programação e to querendo mais do que fazer o código funcionar, quero entender ele.
com variáveis T, D, C eu não consigo ler esse cód pra saber o que ele faz.
Se possível gostaria de um cód pra leigos, bem didático para que eu possa entender.

@rafael-neri

This comment has been minimized.

Copy link
Owner Author

@rafael-neri 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

This comment has been minimized.

Copy link

@edem-fernando 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

This comment has been minimized.

Copy link

@welingtonfidelis welingtonfidelis commented May 18, 2020

Vlw meu chefe =)

@jonasbraga

This comment has been minimized.

Copy link

@jonasbraga 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

This comment has been minimized.

Copy link
Owner Author

@rafael-neri rafael-neri commented Jun 17, 2020

@jonasbraga obrigado pela dica. Código atualizado.

@heliogit

This comment has been minimized.

Copy link

@heliogit 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

This comment has been minimized.

Copy link
Owner Author

@rafael-neri rafael-neri commented Jan 27, 2021

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

@RodsFer25

This comment has been minimized.

Copy link

@RodsFer25 RodsFer25 commented Feb 11, 2021

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

@rafael-neri

This comment has been minimized.

Copy link
Owner Author

@rafael-neri 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

This comment has been minimized.

Copy link

@RodsFer25 RodsFer25 commented Feb 11, 2021

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

@WernerLuiz92

This comment has been minimized.

Copy link

@WernerLuiz92 WernerLuiz92 commented Feb 24, 2021

Show Muito TOP

@pferreirafabricio

This comment has been minimized.

Copy link

@pferreirafabricio pferreirafabricio commented Mar 11, 2021

Muito obrigado!

@narcisspicpay

This comment has been minimized.

Copy link

@narcisspicpay narcisspicpay commented Mar 12, 2021

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

@rafael-neri

This comment has been minimized.

Copy link
Owner Author

@rafael-neri rafael-neri commented Mar 12, 2021

@KaliaryCisne

This comment has been minimized.

Copy link

@KaliaryCisne KaliaryCisne commented Apr 9, 2021

Excelente código Rafael, parabéns!

@pablowkl

This comment has been minimized.

Copy link

@pablowkl pablowkl commented Apr 14, 2021

Muito bom! valeeu

@kelwenjs

This comment has been minimized.

Copy link

@kelwenjs 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.

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