Validar CNPJ em PHP
Assim como o CPF, o CNPJ são números que seguem uma lógica matemática e, conhecendo essa lógica podemos construir funções para verificar se os números fornecidos são ou não CNPJ.
Is_cnpj é uma função em PHP que valida CNPJ. Se a string de entrada for um CNPJ ela é retornada sem formatação (14 caracteres) ou então é retornado falso.
- Aceita com ou sem formatação
xxx.xxx.xxx/xxxx-xxouxxxxxxxxxxxxxxx - Variações de 14, 15, 18 ou 19 caracteres
xxxxxxxxxxxxxx(14)
xxxxxxxxxxxxxxx(15)
xx.xxx.xxx/xxxx-xx(18)
xxx.xxx.xxx/xxxx-xx(19) - Retorna o CNPJ sem formatação com 14 caracteres
xxxxxxxxxxxxxx
function is_cnpj($str) {
if (!preg_match('|^(\d{2,3})\.?(\d{3})\.?(\d{3})\/?(\d{4})\-?(\d{2})$|', $str, $matches))
return false;
array_shift($matches);
$str = implode('', $matches);
if (strlen($str) > 14)
$str = substr($str, 1);
$sum1 = 0;
$sum2 = 0;
$sum3 = 0;
$calc1 = 5;
$calc2 = 6;
for ($i=0; $i <= 12; $i++) {
$calc1 = $calc1 < 2 ? 9 : $calc1;
$calc2 = $calc2 < 2 ? 9 : $calc2;
if ($i <= 11)
$sum1 += $str[$i] * $calc1;
$sum2 += $str[$i] * $calc2;
$sum3 += $str[$i];
$calc1--;
$calc2--;
}
$sum1 %= 11;
$sum2 %= 11;
return ($sum3 && $str[12] == ($sum1 < 2 ? 0 : 11 - $sum1) && $str[13] == ($sum2 < 2 ? 0 : 11 - $sum2)) ? $str : false;
}
Exemplos:
if (is_cnpj($cnpj)) {
// CNPJ válido
}
else {
// CNPJ inválido
}
// Se verdadeiro, a função retorna o CNPJ sem formatação com 14 caracteres
$cnpj = '10.530.985/0001-10';
if ($cnpj = is_cnpj($cnpj)) { // atribuição e comparação
// CNPJ válido
echo $cnpj; // 10530985000110
}
// Erro comum de outros algoritmos - validar cadeia de zeros
if (is_cnpj('00.000.000/0000-00')) {
// ...
}
// CNPJ com 19 caracteres
if (is_cnpj('010.530.985/0001-10')) {
echo 'cnpj válido';
}
// CNPJ sem formatação
if (is_cnpj(10530985000110)) {
echo 'cnpj válido';
}