O Gerador De CPF O Gerador De CPF

Função para Validar CPF em PHP

Função PHP para validar CPF no server-side usando o algoritmo de módulo 11. Útil como camada adicional de validação no back-end, já que validação client-side em JavaScript pode ser contornada.

Código

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

Análise do código

preg_replace('/[^0-9]/is', '', $cpf) remove tudo que não é dígito, aceitando entrada com ou sem pontuação.

preg_match('/(\d)\1{10}/', $cpf) usa backreference para rejeitar CPFs com 11 dígitos iguais (ex: 11111111111).

O loop for ($t = 9; $t < 11; $t++) calcula ambos os dígitos verificadores numa única estrutura. Na primeira iteração ($t=9), calcula o primeiro dígito com pesos de 10 a 2. Na segunda ($t=10), calcula o segundo com pesos de 11 a 2. A fórmula ((10 * $d) % 11) % 10 é equivalente ao complemento de 11 padrão.

Uso

validaCPF("529.982.247-25"); // true
validaCPF("111.111.111-11"); // false
validaCPF("52998224725");    // true

Testes

Testes com PHPUnit:

use PHPUnit\Framework\TestCase;

class ValidaCPFTest extends TestCase
{
    public function testCpfValidoComPontuacao(): void
    {
        $this->assertTrue(validaCPF('529.982.247-25'));
    }

    public function testCpfValidoSemPontuacao(): void
    {
        $this->assertTrue(validaCPF('52998224725'));
    }

    public function testCpfComDigitosRepetidos(): void
    {
        $this->assertFalse(validaCPF('111.111.111-11'));
    }

    public function testCpfComDigitoVerificadorIncorreto(): void
    {
        $this->assertFalse(validaCPF('529.982.247-26'));
    }

    public function testCpfComTamanhoIncorreto(): void
    {
        $this->assertFalse(validaCPF('123.456.789'));
    }
}

Use o gerador de CPF válido para criar números de teste e verificar se a sua função está funcionando corretamente.