<?php

/*
 * Função para validação avançada de CNPJ
 * @author Leonardo Cesar Teixeira <leonardo.teixeira@msn.com>
 * @version 1.0
 * @param string $cnpj
 * @return bool
 */
function valida_cnpj($cnpj) {
    // Verifica se o formato do CNPJ está correto
    $pattern = '/^[0-9]{2}\.[0-9]{3}\.[0-9]{3}\/[0-9]{4}-[0-9]{2}/';
    if (!preg_match($pattern, $cnpj)) {
        return false;
    }

    // Captura apenas os 11 números do CPF
    $cnpj = preg_replace('/[^0-9]/', '', $cnpj);


    // Verifica se não foram informados números sequenciais (exemplo: 00.000.000/0000-00)
    if (str_repeat($cnpj[0], 14) == $cnpj) {
        return false;
    }

    // Verifica se o primeiro dígito verificador confere
    $digitoUmMultiplicadores = array(5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2);

    $digitoUmSoma = 0;

    for ($i = 0; $i < 12; $i++) {
        $digitoUmSoma += ( $cnpj[$i] * $digitoUmMultiplicadores[$i]);
    }

    $digitoUmResultado = $digitoUmSoma % 11;
    $digitoUmResultado = ($digitoUmResultado < 2) ? 0 : (11 - $digitoUmResultado);


    if ($cnpj[12] != $digitoUmResultado) {
        return false;
    }

    // Verifica se o segundo dígito verificador confere
    $digitoUmMultiplicadores = array(6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2);

    $digitoDoisSoma = 0;

    for ($i = 0; $i < 13; $i++) {
        $digitoDoisSoma += ( $cnpj[$i] * $digitoUmMultiplicadores[$i]);
    }

    $digitoDoisResultado = $digitoDoisSoma % 11;
    $digitoDoisResultado = ($digitoDoisResultado < 2) ? 0 : (11 - $digitoDoisResultado);

    if ($cnpj[13] != $digitoDoisResultado) {
        return false;
    }

    return true;
}

// Testando...

echo '<pre>', PHP_EOL;

var_dump( valida_cnpj( '00.000.000/0000-00' ) ); // CNPJ inválido
var_dump( valida_cnpj( '99.999.999/9999-99' ) ); // CNPJ inválido
var_dump( valida_cnpj( '06.947.284/0001-04' ) ); // CNPJ válido

echo '</pre>';