Entenda quais são as regras de validação do CPF e como funcionam as funções de validação destas sequências numéricas.

Introdução

Existem diversas situações em que precisamos validar números de CPF para garantir a integridade dos dados informados por usuários ou até mesmo aplicações de terceiros. Mas afinal, o que define se um número de CPF é válido ou não? A seguir veremos as regras de validação do CPF e como aplicá-las a uma função de validação escrita em PHP.

Regra de validação do CPF

Um número de CPF válido tem o formato 999.999.999-99: 11 dígitos sequenciais de 0 à 9, sendo os dois últimos utilizados como dígitos verificadores. Os separadores (pontos e traço) servem apenas como máscara do número e são desprezados para fins de validação.

Vamos tomar o número de CPF 111.222.333-45 como exemplo para ilustrar as próximas etapas da validação. Este número de CPF é composto por 11 dígitos de 0 à 9, portanto resta apenas conferir se seus dígitos verificadores são de fato 4 e 5. Para tanto, vamos calcular seus dígitos verificadores com base em seus 9 primeiros dígitos.

Cálculo do primeiro dígito verificador

Para calcularmos o primero dígito verificador A de um número de CPF, devemos primeiramente multiplicar cada um de seus 9 primeiros dígitos por uma sequência de números decrescentes começando em 10 e somar os resultados de todas estas multiplicações. Aplicando este cálculo ao nosso número de CPF de exemplo, temos:

	
A = (1 * 10) + (1 * 9) + (1 * 8) + (2 * 7) + (2 * 6) + (2 * 5) + (3 * 4) + (3 * 3) + (3 * 2)
A = 10 + 9 + 8 + 14 + 12 + 10 + 12 + 9 + 6
A = 90
	

Em seguida devemos dividir o resultado obtido com este somatório por 11, logo:

	
A = 90 % 11
A = 8 // Com resto 2
	

A parte que nos interessa nesta divisão é o resto obtido. Se este resto for menor do que 2, o primeiro dígito verificador será 0. Caso contrário, o primeiro dígito verificador será 11 menos o resto obtido. Logo, o primeiro dígito verificador do nosso número de CPF de exemplo é 9, pois:

	
A = 11 - 2
A = 9
	

Neste ponto já sabemos que o nosso número de CPF de exemplo é composto pelos dígitos 111.222.333-9?. Resta apenas calcularmos o segundo dígito verificador.

Cálculo do segundo dígito verificador

Para calcularmos o segundo dígito verificador B de um número de CPF, devemos primeiramente multiplicar cada um de seus 10 primeiros dígitos (sendo o décimo dígito o o primeiro dígito verificador calculado na etapa anterior) por uma sequência de números decrescentes começando em 11 e somar os resultados de todas estas multiplicações. Aplicando este cálculo ao nosso número de CPF de exemplo, temos:

	
B = (1 * 11) + (1 * 10) + (1 * 9) + (2 * 8) + (2 * 7) + (2 * 6) + (3 * 5) + (3 * 4) + (3 * 3) + (9 * 2)
B = 11 + 10 + 9 + 16 + 14 + 12 + 15 + 12 + 9 + 18
B = 126
	

Em seguida devemos novamente dividir o resultado obtido com este somatório por 11, logo:

	
B = 126 % 11
B = 11 // Com resto 5
	

Novamente avaliamos o resto obtido por esta divisão. Se este resto for menor do que 2, o segundo dígito verificador será 0. Caso contrário, o segundo dígito verificador será 11 menos o resto obtido. Logo, o segundo dígito verificador do nosso número de CPF de exemplo é 6, pois:

	
B = 11 - 5
B = 6
	

Pronto! Temos os dois dígitos verificadores do nosso número de CPF de exemplo. A partir disso concluímos que o nosso CPF de exemplo 111.222.333-45 é inválido, pois seus dígitos verificadores são 9 e 6, conforme calculamos e não 4 e 5.

Abaixo segue uma função em PHP responsável por realizar todos os cálculos vistos acima. A função retorna true, se o parâmetro passado for um número de CPF válido (com ou sem os separadores), ou false, caso contrário.

ATENÇÃO: Números de CPF com todos os dígitos iguais, como por exemplo 111.111.111-11, 222.222.222-22, etc, apesar de passarem pelos testes de validação, são considerados inválidos.

	
<?php
function is_valid_cpf($cpf) {
	// Remove todos os caracteres inválidos
	$cpf = preg_replace('/[^0-9]/', '', $cpf);

	// Verifica se o CPF informado contém 11 caracteres
	if (strlen($cpf) == 11) {
		// Verifica se os dígitos que compõem o CPF são todos iguais
		for ($i = 0; $i <= 9; $i++) {
			if ($cpf == implode('', array_fill(0, 11, $i))) {
				return false;
			}
		}

		// Calcula os dois dígitos verificadores do CPF
		$check_digits = substr($cpf, -2);
		$cpf = substr($cpf, 0, 9);
		for ($i = 0; $i <= 1; $i++) {
			$check_digit = 0;
			for ($j = 0; $j <= 8 + $i; $j++) {
				$check_digit += intval($cpf[$j]) * (10 + $i - $j);
			}
			$check_digit = ($check_digit % 11) < 2 ? 0 : 11 - ($check_digit % 11);
			$cpf .= strval($check_digit);
		}

		// Retorna o resultado da igualdade entre o CPF informado e o CPF calculado
		return substr($cpf, -2) == $check_digits;
	}
	return false;
}
?>
	

Conclusão

Conhecer as regras de validação de números de CPF pode ser bastante útil na hora de desenvolver extensões de bibliotecas de validação de dados, visto que o CPF é uma sequência numérica relevante apenas no Brasil.

Saiba mais