public static function validade_cpf($cpf = null) { function calc_digitos_posicoes($digitos, $posicoes = 10, $soma_digitos = 0) { for ($i = 0; $i < strlen($digitos); $i++) { $soma_digitos = $soma_digitos + $digitos[$i] * $posicoes; $posicoes--; } $soma_digitos = $soma_digitos % 11; if ($soma_digitos < 2) { $soma_digitos = 0; } else { $soma_digitos = 11 - $soma_digitos; } $cpf = $digitos . $soma_digitos; return $cpf; } if (!$cpf) { return false; } $cpf = self::only_numbers('/[^0-9]/is', '', $cpf); if (strlen($cpf) != 11) { return false; } $digitos = substr($cpf, 0, 9); $novo_cpf = calc_digitos_posicoes($digitos); $novo_cpf = calc_digitos_posicoes($novo_cpf, 11); return $novo_cpf === $cpf; }
/** * Valida CPF * * @param string $cpf O CPF com ou sem pontos e traço * @return bool True para CPF correto - False para CPF incorreto * */ function validarCPF($cpf = false) { if (!$cpf) { return false; } $cpf = preg_replace('/[^0-9]/is', '', $cpf); if (strlen($cpf) != 11) { return false; } $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; } }
/** * Valida CPF * * @author Luiz Otávio Miranda <contato@todoespacoonline.com/w> * @param string $cpf O CPF com ou sem pontos e traço * @return bool True para CPF correto - False para CPF incorreto * */ 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 * */ 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; } if ($cpf == '00000000000' || $cpf == '11111111111' || $cpf == '22222222222' || $cpf == '33333333333' || $cpf == '44444444444' || $cpf == '55555555555' || $cpf == '66666666666' || $cpf == '77777777777' || $cpf == '88888888888' || $cpf == '99999999999') { 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; } }