Para exemplificar o processo vamos gerar um CPF válido, calculando os dígitos verificadores de um número hipotético, 111.444.777-XX.
Calculando o Primeiro Dígito Verificador:
O primeiro dígito verificador do CPF é calculado utilizando-se o seguinte algoritmo. 1) Distribua os 9 primeiros dígitos em um quadro colocando os pesos 10, 9, 8, 7, 6, 5, 4, 3, 2 abaixo da esquerda para a direita, conforme representação abaixo:
1 | 1 | 1 | 4 | 4 | 4 | 7 | 7 | 7 |
10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
2) Multiplique os valores de cada coluna:
1 | 1 | 1 | 4 | 4 | 4 | 7 | 7 | 7 |
10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
10 | 9 | 8 | 28 | 24 | 20 | 28 | 21 | 14 |
3) Calcule o somatório dos resultados (10+9+...+21+14) = 162
4) O resultado obtido (162) será divido por 11. Considere como quociente apenas o valor inteiro, o resto da divisão será responsável pelo cálculo do primeiro dígito verificador.
Vamos acompanhar: 162 dividido por 11 obtemos 14 como quociente e 8 como resto da divisão. Caso o resto da divisão seja menor que 2, o nosso primeiro dígito verificador se torna 0 (zero), caso contrário subtrai-se o valor obtido de 11, que é nosso caso. Sendo assim nosso dígito verificador é 11-8, ou seja, 3 (três). Já temos portanto parte do CPF, confira: 111.444.777-3X.
Veja agora como implementar isso em PHP + jQuery:
Arquivo => index.html:
-------------------------------------------------------------------------------------------------------------------
<html>
<head>
<script src="js/jquery-1.2.6.pack.js" type="text/javascript"></script>
<script src="js/jquery.maskedinput-1.1.4.pack.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function(){
$("#cpf").mask("999.999.999-99");
});
//minha funcao validadora
function enviaValor(){
var valor = $('#cpf').val();
//console.log($('#cpf').val());
$(document).ready(function(){
//efetuando a gravação e contabilização de pratos mais acessados
$.post(
"./validar.php",
{ codigo: valor },
function(data) {
//console.log(data);
if(data == 1) {
$("#saida").html("<span style='color: green'>CPF Válido!</span>");
} else {
$("#saida").html("<span style='color: red'>CPF Inválido!</span>");
}
}
);
});
}
</script>
</head>
<title>
Validar CPF
</title>
</html></pre>
<body>
<form action="" id="form1" method="post" name="form1">
<div align="center">
<table border="0" cellpadding="0" cellspacing="0" style="width: 100%px;">
<tbody>
<tr>
<td height="40">
<div align="center">
<input class="saida" id="cpf" name="cpf" type="text" />
</div>
</td>
</tr>
<tr>
<td>
<div align="center">
<input id="botaoValidarCPF" name="botaoValidarCPF" onclick="enviaValor();" style="cursor: pointer; font-size: 15px;" type="button" value="Validar CPF" />
</div>
<div align="center" class="style7" id="saida">
<span style="color: green;"></span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</form>
</body>
------------------------------------------------------------------------------Observe que linha onde é importado o arquivo .js, é uma biblioteca (jquery.maskedinput) de mascaras javascript e é aplicada na linha 7;
Em seguida é criado uma função javascript de nome "enviaValor()" que possui uma requisição Ajax jQuery $.post que envia o valor do campo de formulario para o arquivo PHP "validar.php" receber e procesar da seguinte forma:
---------------------------------------------------------------------------------------------------------------------
<?php
//recebe o dado vindo da pagina via Ajax jQuery
$cpf = (isset($_REQUEST['codigo'])) ? $_REQUEST['codigo'] : "" ;
//funcao que retira o ponto e traço e valida o CPF com o calculo do algoritmo
function validaCPF($cpf = null) {
// Verifica se um número foi informado
if(empty($cpf)) {
return false;
}
// Elimina possivel mascara
$cpf = ereg_replace('[^0-9]', '', $cpf);
$cpf = str_pad($cpf, 11, '0', STR_PAD_LEFT);
// Verifica se o numero de digitos informados é igual a 11
if (strlen($cpf) != 11) {
return false;
}
// Verifica se nenhuma das sequências invalidas abaixo
// foi digitada. Caso afirmativo, retorna falso
else if ($cpf == '00000000000' ||
$cpf == '11111111111' ||
$cpf == '22222222222' ||
$cpf == '33333333333' ||
$cpf == '44444444444' ||
$cpf == '55555555555' ||
$cpf == '66666666666' ||
$cpf == '77777777777' ||
$cpf == '88888888888' ||
$cpf == '99999999999') {
return false;
// Calcula os digitos verificadores para verificar se o
// CPF é válido
} else {
for ($t = 9; $t < 11; $t++) {
for ($d = 0, $c = 0; $c < $t; $c++) {
$d += $cpf{$c} * (($t + 1) - $c);
}
$d = ((10 * $d) % 11) % 10;
if ($cpf{$c} != $d) {
return false;
}
}
return true;
}
}
//verifica se não enviado o formulario em branco
if($cpf !== ""){
//verifica se a funçao retornou "true" ou "false"
if(validaCPF($cpf)){
echo 1;
} else {
echo 0;
}
} else {
echo "Digite um CPF!";
}
?>
---------------------------------------------------------------------------------------------------------------------
Um exemplo funcionando pode ser visto abaixo:
Um abraço e até a próxima a todos(as)!