PHP
Validar e gerar CPF em PHP
PHP 7.4+. Sem dependência de extensão além da PCRE, que já vem habilitada.
Validação
A função devolve true apenas quando o número tem 11 dígitos, não é uma sequência repetida e os dois dígitos verificadores conferem.
<?php
function validarCpf(?string $valor): bool
{
$cpf = preg_replace('/\D/', '', (string) $valor);
// 11 dígitos e nada de sequências repetidas.
if (strlen($cpf) !== 11 || preg_match('/^(\d)\1{10}$/', $cpf)) {
return false;
}
// Peso posicional: n=9 usa pesos de 10 a 2; n=10, de 11 a 2.
$dv = static function (int $n) use ($cpf): int {
$soma = 0;
for ($i = 0; $i < $n; $i++) {
$soma += (int) $cpf[$i] * ($n + 1 - $i);
}
$resto = $soma % 11;
return $resto < 2 ? 0 : 11 - $resto;
};
return $dv(9) === (int) $cpf[9] && $dv(10) === (int) $cpf[10];
}Geração
Sorteia os nove primeiros dígitos e calcula os verificadores — o mesmo caminho, ao contrário.
<?php
function gerarCpf(): string
{
$base = [];
for ($i = 0; $i < 9; $i++) {
$base[] = random_int(0, 9);
}
$dv = static function (array $digitos): int {
$soma = 0;
$total = count($digitos);
foreach ($digitos as $i => $d) {
$soma += $d * ($total + 1 - $i);
}
$resto = $soma % 11;
return $resto < 2 ? 0 : 11 - $resto;
};
$d1 = $dv($base);
$d2 = $dv(array_merge($base, [$d1]));
return implode('', array_merge($base, [$d1, $d2]));
}Uso
validarCpf('111.444.777-35'); // true
validarCpf('111.111.111-11'); // false
gerarCpf(); // '52998224725'Os dois pontos em que essas funções costumam quebrar
Toda implementação de CPF erra nos mesmos dois lugares, e as duas armadilhas estão tratadas no código acima:
- Resto 0 ou 1. Quando o resto da divisão por 11 é menor que 2, o dígito verificador é
0— e não11 - resto, que daria 10 ou 11. Pular essa regra faz o validador rejeitar cerca de um terço dos CPFs legítimos. - Dígitos repetidos.
111.111.111-11e as outras nove sequências iguais passam na conta do módulo 11. Como são exatamente o que se digita para testar um formulário, precisam de uma verificação à parte.
A explicação completa da aritmética, com exemplo resolvido dígito a dígito, está emcomo validar um CPF.
Números para testar
Para exercitar a função com dados de verdade, o gerador produz até 1000 CPFs válidos por vez e exporta em .txt, .csv ou .json — pronto para virar fixture do seu conjunto de testes.
Casos que vale incluir na suíte: 111.444.777-35 (válido),111.111.111-11 (repetido, deve falhar), 123 (curto demais) e uma string vazia.
Outras linguagens
JavaScript · TypeScript · Python · Java · C#