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.

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.