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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.