Alejandro Moraga 7 December 2010 – 8:31 am

Validar CNPJ em PHP

receita-federal

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-xx ou xxxxxxxxxxxxxxx
  • 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';
}