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 commented Jan 9, 2018

testou?

@rafael-neri

This comment has been minimized.

Copy link
Owner Author

rafael-neri commented Feb 6, 2018

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

@Wyru

This comment has been minimized.

Copy link

Wyru commented Feb 16, 2018

Muito bom :)

@nicklleite

This comment has been minimized.

Copy link

nicklleite commented Feb 20, 2018

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

@RenanLazarotto

This comment has been minimized.

Copy link

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 commented Nov 2, 2018

Funcioou bacana! Parabéns!

@alanrbentes

This comment has been minimized.

Copy link

alanrbentes commented Jan 23, 2019

Código otimizado, excelente ! Vlu.

@israeldax

This comment has been minimized.

Copy link

israeldax commented May 31, 2019

Obrigado por compartilhar!

@jonathangoncalves

This comment has been minimized.

Copy link

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 commented Jul 1, 2019

@jonathangoncalves, ficou bem bacana.

@rogerionunes

This comment has been minimized.

Copy link

rogerionunes commented Aug 28, 2019

Show! Valeu!

@softkleen

This comment has been minimized.

Copy link

softkleen commented Sep 19, 2019

obrigado!

@ghost

This comment has been minimized.

Copy link

ghost commented Oct 24, 2019

O senhor esta de parabens meu garoto

@rhaymisonbetini

This comment has been minimized.

Copy link

rhaymisonbetini commented Nov 19, 2019

show de bola meu garoto

@guifavere

This comment has been minimized.

Copy link

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

O site está em português para facilitar a compreensão.

@edem-fernando

This comment has been minimized.

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

This comment has been minimized.

Copy link

welingtonfidelis commented May 18, 2020

Vlw meu chefe =)

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.