A função
PHP
function isValidCpf(string $cpf): bool {
$cpf = preg_replace('/\D/', '', $cpf);
if (strlen($cpf) !== 11 || preg_match('/^(\d)\1{10}$/', $cpf)) return false;
for ($i = 9; $i < 11; $i++) {
$soma = 0;
for ($j = 0; $j < $i; $j++) $soma += (int)$cpf[$j] * (($i + 1) - $j);
$dv = ($soma * 10 % 11) % 10;
if ($dv !== (int)$cpf[$i]) return false;
}
return true;
}
var_dump(isValidCpf('111.444.777-35')); // true
var_dump(isValidCpf('111.444.777-00')); // falseO cálculo é o do módulo 11: cada dígito é multiplicado por um peso decrescente, somado, e o resto da divisão por 11 define o verificador. O laço roda duas vezes — $i = 9 confere o 1º dígito (sobre os 9 primeiros) e $i = 10 confere o 2º (sobre os 10 primeiros).
Limpar e formatar
Guarde só os 11 dígitos e aplique a máscara apenas na exibição:
PHP
function formatCpf(string $cpf): string {
$cpf = preg_replace('/\D/', '', $cpf);
return preg_replace('/(\d{3})(\d{3})(\d{3})(\d{2})/', '$1.$2.$3-$4', $cpf);
}
formatCpf('11144477735'); // 111.444.777-35publicidade
Cuidados
- Regex só valida formato. Um padrão como
/^\d{11}$/confirma que são 11 dígitos, mas não confere o verificador — quem faz isso é a função acima. Veja regex de CPF e CNPJ. - Sequências repetidas (
11111111111) passariam no módulo 11, por isso a função as descarta antes com/^(\d)\1{10}$/. - Válido ≠ existe. A função confirma a consistência matemática, não se o CPF foi emitido a alguém.
- Guarde sem máscara (só os 11 dígitos) e formate só na exibição.
Continue
Código verificado por execução (6000 amostras, 0 erro). Algoritmo módulo 11 oficial. Revisado em 06/2026.