Validando CPF e CNPJ com PHP
Neste artigo você vai ver como criar duas funções em PHP para validar o número do CPF e do CNPJ.
A lógica de validação destes dois documentos é parecida. Os dois últimos números são chamados de dígitos verificadores. São feitas operações com os demais números, e o resultado deve ser igual aos dígitos verificadores.
Para saber em detalhes as regras de validação, consulte os links a seguir:
Como funciona a lógica da validação do CPF
Como funciona a lógica da validação do CNPJ
Ambas as funções tem uma estrutura parecida. Vamos pegar como exemplo a função que vai validar o CPF
function validaCPF($cpf = null) {
//Programação a ser inserida
}
A função vai retornar TRUE se o número informado for válido, e false se for errado ou não tiver sido informado.
A primeira validação é conferir se um número foi informado
if(empty($cpf)) {
return false;
}
Se um número tiver sido informado, são retirados os pontos, traços e barras, desta forma são mantidos apenas o números informados. Se a quantidade de números for menor que o padrão, se completa com zeros a esquerda.
$cpf = preg_replace("/[^0-9]/", "", $cpf);
$cpf = str_pad($cpf, 11, "0", STR_PAD_LEFT);
Tanto o CPF quanto o CNPJ não podem ser compostos apenas de números repetidos.
$repeticoes = array("00000000000","11111111111","22222222222","33333333333","44444444444","55555555555","66666666666","77777777777","88888888888","99999999999");
if (in_array($cpf, $repeticoes)) {
return false;
}
Se o número tiver o tamanho correto, se faz a verificação para validar o número em relação ao seu dígito verificador
if (in_array($cpf, $repeticoes)) {
return false;
} else {
// Calcula os digitos verificadores para verificar se o CPF é válido
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;
}
Para concluir o artigo, vamos ver as duas funções completas.
Função PHP para validar o CPF
function validaCPF($cpf = null) {
// Verifica se um número foi informado
if(empty($cpf)) {
return false;
}
// Elimina a mascara
$cpf = preg_replace("/[^0-9]/", "", $cpf);
$cpf = str_pad($cpf, 11, "0", STR_PAD_LEFT);
$repeticoes = array("00000000000","11111111111","22222222222","33333333333","44444444444","55555555555","66666666666","77777777777","88888888888","99999999999");
// Verifica se nenhuma das sequências invalidas abaixo foi digitada. Caso afirmativo, retorna falso
if (in_array($cpf, $repeticoes)) {
return false;
} else {
// Calcula os digitos verificadores para verificar se o CPF é válido
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;
}
}
Função PHP para validar o CNPJ
function validaCNPJ($cnpj = null) {
// Verifica se um número foi informado
if(empty($cnpj)) {
return false;
}
// Elimina possivel mascara
$cnpj = preg_replace("/[^0-9]/", "", $cnpj);
$cnpj = str_pad($cnpj, 14, "0", STR_PAD_LEFT);
$repeticoes = array("00000000000000","11111111111111","22222222222222","33333333333333","44444444444444","55555555555555","66666666666666","77777777777777","88888888888888","99999999999999");
// Verifica se nenhuma das sequências invalidas abaixo foi digitada. Caso afirmativo, retorna falso
if (in_array($$cnpj, $repeticoes)) {
return false;
} else {
// Calcula os digitos verificadores para verificar se o CNPJ é válido
$j = 5;
$k = 6;
$soma1 = "";
$soma2 = "";
for ($i = 0; $i < 13; $i++) {
$j = $j == 1 ? 9 : $j;
$k = $k == 1 ? 9 : $k;
$soma2 += ($cnpj[$i] * $k);
if ($i < 12) {
$soma1 += ($cnpj[$i] * $j);
}
$k--;
$j--;
}
$digito1 = $soma1 % 11 < 2 ? 0 : 11 - $soma1 % 11;
$digito2 = $soma2 % 11 < 2 ? 0 : 11 - $soma2 % 11;
return (($cnpj[12] == $digito1) and ($cnpj[13] == $digito2));
}
}