Validating CPF and CNPJ with php Function

Asked

Viewed 4,179 times

4

Guys I have two Unction, being them valida_cpf verifying the Commission and valida_cnpj that checks the cnpj.

Well both work perfectly, but I wanted to know if it is possible to merge the two, ie create a single function called valida_cpf_cnpj.

Could someone help me?

Goes about his duties:

            function valida_cnpj($cnpj) {
            // Deixa o CNPJ com apenas números
            $cnpj = preg_replace('/[^0-9]/', '', $cnpj);

            // Garante que o CNPJ é uma string
            $cnpj = (string) $cnpj;

            // O valor original
            $cnpj_original = $cnpj;

            // Captura os primeiros 12 números do CNPJ
            $primeiros_numeros_cnpj = substr($cnpj, 0, 12);

            /**
             * Multiplicação do CNPJ
             *
             * @param string $cnpj Os digitos do CNPJ
             * @param int $posicoes A posição que vai iniciar a regressão
             * @return int O
             *
             */
            if (!function_exists('multiplica_cnpj')) {

                function multiplica_cnpj($cnpj, $posicao = 5) {
                    // Variável para o cálculo
                    $calculo = 0;

                    // Laço para percorrer os item do cnpj
                    for ($i = 0; $i < strlen($cnpj); $i++) {
                        // Cálculo mais posição do CNPJ * a posição
                        $calculo = $calculo + ( $cnpj[$i] * $posicao );

                        // Decrementa a posição a cada volta do laço
                        $posicao--;

                        // Se a posição for menor que 2, ela se torna 9
                        if ($posicao < 2) {
                            $posicao = 9;
                        }
                    }
                    // Retorna o cálculo
                    return $calculo;
                }

            }

            // Faz o primeiro cálculo
            $primeiro_calculo = multiplica_cnpj($primeiros_numeros_cnpj);

            // Se o resto da divisão entre o primeiro cálculo e 11 for menor que 2, o primeiro
            // Dígito é zero (0), caso contrário é 11 - o resto da divisão entre o cálculo e 11
            $primeiro_digito = ( $primeiro_calculo % 11 ) < 2 ? 0 : 11 - ( $primeiro_calculo % 11 );

            // Concatena o primeiro dígito nos 12 primeiros números do CNPJ
            // Agora temos 13 números aqui
            $primeiros_numeros_cnpj .= $primeiro_digito;

            // O segundo cálculo é a mesma coisa do primeiro, porém, começa na posição 6
            $segundo_calculo = multiplica_cnpj($primeiros_numeros_cnpj, 6);
            $segundo_digito = ( $segundo_calculo % 11 ) < 2 ? 0 : 11 - ( $segundo_calculo % 11 );

            // Concatena o segundo dígito ao CNPJ
            $cnpj = $primeiros_numeros_cnpj . $segundo_digito;

            // Verifica se o CNPJ gerado é idêntico ao enviado
            if ($cnpj === $cnpj_original) {
                return true;
            }
        }

        function valida_cpf( $cpf = false ) {
            // Exemplo de CPF: 025.462.884-23

            /**
             * Multiplica dígitos vezes posições 
             *
             * @param string $digitos Os digitos desejados
             * @param int $posicoes A posição que vai iniciar a regressão
             * @param int $soma_digitos A soma das multiplicações entre posições e dígitos
             * @return int Os dígitos enviados concatenados com o último dígito
             *
             */
            if ( ! function_exists('calc_digitos_posicoes') ) {
                function calc_digitos_posicoes( $digitos, $posicoes = 10, $soma_digitos = 0 ) {
                    // Faz a soma dos dígitos com a posição
                    // Ex. para 10 posições: 
                    //   0    2    5    4    6    2    8    8   4
                    // x10   x9   x8   x7   x6   x5   x4   x3  x2
                    //   0 + 18 + 40 + 28 + 36 + 10 + 32 + 24 + 8 = 196
                    for ( $i = 0; $i < strlen( $digitos ); $i++  ) {
                        $soma_digitos = $soma_digitos + ( $digitos[$i] * $posicoes );
                        $posicoes--;
                    }

                    // Captura o resto da divisão entre $soma_digitos dividido por 11
                    // Ex.: 196 % 11 = 9
                    $soma_digitos = $soma_digitos % 11;

                    // Verifica se $soma_digitos é menor que 2
                    if ( $soma_digitos < 2 ) {
                        // $soma_digitos agora será zero
                        $soma_digitos = 0;
                    } else {
                        // Se for maior que 2, o resultado é 11 menos $soma_digitos
                        // Ex.: 11 - 9 = 2
                        // Nosso dígito procurado é 2
                        $soma_digitos = 11 - $soma_digitos;
                    }

                    // Concatena mais um dígito aos primeiro nove dígitos
                    // Ex.: 025462884 + 2 = 0254628842
                    $cpf = $digitos . $soma_digitos;

                    // Retorna
                    return $cpf;
                }
            }

            // Verifica se o CPF foi enviado
            if ( ! $cpf ) {
                return false;
            }

            // Remove tudo que não é número do CPF
            // Ex.: 025.462.884-23 = 02546288423
            $cpf = preg_replace( '/[^0-9]/is', '', $cpf );

            // Verifica se o CPF tem 11 caracteres
            // Ex.: 02546288423 = 11 números
            if ( strlen( $cpf ) != 11 ) {
                return false;
            }   

            // Captura os 9 primeiros dígitos do CPF
            // Ex.: 02546288423 = 025462884
            $digitos = substr($cpf, 0, 9);

            // Faz o cálculo dos 9 primeiros dígitos do CPF para obter o primeiro dígito
            $novo_cpf = calc_digitos_posicoes( $digitos );

            // Faz o cálculo dos 10 dígitos do CPF para obter o último dígito
            $novo_cpf = calc_digitos_posicoes( $novo_cpf, 11 );

            // Verifica se o novo CPF gerado é idêntico ao CPF enviado
            if ( $novo_cpf === $cpf ) {
                // CPF válido
                return true;
            } else {
                // CPF inválido
                return false;
            }
        }






        // Verifica o CPF
        if ( valida_cpf( '47039216507' ) ) {
                echo "CPF é válido. <br>";
        } else {
                echo "CPF Inválido.  <br>";
        }



        // Valida um CNPJ
        if ( valida_cnpj('12345678000195') ) {
                echo "CNPJ correto.  <br>";
        } else {
                echo "CNPJ inválido.  <br>";
        }

2 answers

3


Just create a function that checks the number of digits of the value

fuction cpfOuCnpj($cpfoucnpj){
    //Caso seja CNPJ
    if(strlen($cpfoucnpj) == 14) {
        valida_cpf($cpfoucnpj);
    }

    //Caso seja CPF
    if(strlen($cpfoucnpj) == 11) {
        valida_cnpj($cpfoucnpj);
    }
}

2

When you receive the variable in your valida_cpf_cnpj:

  • Remove the special characters
  • Count the numbers:
  • If it’s 11, CPF. 14, CNPJ

Then just do the validations

  • hi, I tried that way, but it’s not working out. I think I’m doing something wrong.

  • Post the error you are giving here in the comment, that then I can edit the answer.

  • tried so: Function valida_cpf_cnpj($cnpj_cpf) { // Checks if it is CNPJ if (strlen($cnpj_cpf) > 11) { valida_cnpj($cnpj_cpf); } Else { valida_cpf($cnpj_cpf); } }

  • but it didn’t work out

  • I repeat: Post the error.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.