Skip to content

Instantly share code, notes, and snippets.

@rafael-neri
Last active November 26, 2024 11:38
Show Gist options
  • Save rafael-neri/ab3e58803a08cb4def059fce4e3c0e40 to your computer and use it in GitHub Desktop.
Save rafael-neri/ab3e58803a08cb4def059fce4e3c0e40 to your computer and use it in GitHub Desktop.
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;
}
@joao-pedro-alves
Copy link

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

Isso não é possivel fazer.

@KaikSilva
Copy link

Eu costumo validar o cpf (em javascript) assim, valida super bem, até mesmo se existe ou não

/*
* return true|false
*/
ValidaCPF(cpf){
    const strCPF = cpf.replaceAll(/\D/g , "");

    var Soma = 0;
    
    for (var i=1; i<=9; i++) {
        var Soma = Soma + parseInt(strCPF.substring(i - 1, i)) * (11 - i);
    }

    var 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;
}

@joao-pedro-alves
Copy link

Eu costumo validar o cpf (em javascript) assim, valida super bem, até mesmo se existe ou não

/*
* return true|false
*/
ValidaCPF(cpf){
    const strCPF = cpf.replaceAll(/\D/g , "");

    var Soma = 0;
    
    for (var i=1; i<=9; i++) {
        var Soma = Soma + parseInt(strCPF.substring(i - 1, i)) * (11 - i);
    }

    var 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;
}

Seu código não valida se existe um CPF, ele supostamente só valida se a sequência de números é uma sequência válida, isso não significa que o CPF exista de fato. São coisas diferentes. Unica maneira de se validar a existência de um CPF é através do site da Receita Federal.

@PantaneiroCG
Copy link

Show de bola, parabéns!

@VivianeScatolon
Copy link

Ola, por acaso algum de voces ja conseguiram colocar validador no user registration?

@hiltonbruce
Copy link

Versão para Laravel 11

Executar comando na raiz do projeto

php artisan make:rule ValidaCPF

Classe criada com o comando anterior deverá ficar assim:

<?php

namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

class ValidaCPF implements ValidationRule
{
    /**
     * Run the validation rule.
     *
     * @param  \Closure(string, ?string=): \Illuminate\Translation\PotentiallyTranslatedString  $fail
     */
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        //https://gist.github.com/rafael-neri/ab3e58803a08cb4def059fce4e3c0e40
        // rafael-neri/validar_cpf.php
            // Extrai somente os números
        $cpf = preg_replace( '/[\D]/is', '', $value );

        // Verifica se foi informado todos os digitos corretamente
        if (strlen($cpf) != 11) {
             $fail('O :attribute deve ter exatamente 11 números.');
        }

        // Verifica se foi informada uma sequência de digitos repetidos. Ex: 111.111.111-11
        if (preg_match('/(\d)\1{10}/', $cpf)) {
            $fail('O :attribute não deve ser uma sequência de números iguais.');
        }

        // 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) {
                $fail('O :attribute não é um número válido.');
            }
        }
    }
}

Depois que a regra for definida, você pode anexá-la a um validador, como o exemplo a seguir:

use App\Rules\ValidaCPF;
 
$request->validate([
    'cpf' => ['required', 'string', new ValidaCPF],
]);

@rafael-neri
Copy link
Author

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