Validar CPF em PHP: Função com Testes PHPUnit
Independente de usar a ferramenta geradora de CPF para testes ou receber dados reais de usuários, toda aplicação PHP precisa validar CPF no server-side. Esta função aplica o módulo 11 como camada de segurança no back-end, já que validação client-side 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"); // trueTestes
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.
Se o seu back-end também precisa gerar CPFs para seeds ou fixtures, veja a função de geração de CPF em PHP.