Cita:
Empezado por Sistel
Yo, desde hace muchos años, uso las mismas funciones para comprobar si un documento (NIF, NIE o CIF) expedido en España es válido.
En PHP, llamando a la función COMPROBAR_DOCUMENTO($nif) :
Código PHP:
<?php function COMPROBAR_DOCUMENTO($nif){ // Limpia $nif = LIMPIAR_NIF($nif); // Comprueba NIF, CIF o NIE if(stristr("XYZ", $nif[0])) $salida = COMPROBAR_NIE($nif); if(stristr("ABCDEFGHJKLMNPQRSUVW", $nif[0])) $salida = COMPROBAR_CIF($nif); if(stristr("0123456789", $nif[0])) $salida = COMPROBAR_NIF($nif); // Si la comprobación ha dado errónea se devuelve texto if($salida <> '1') return "Error en documento (CIF/NIF/NIE)"; return ""; } /***************************************************************************************************************/ function COMPROBAR_NIE($nie){ if($nie[0] == "X") $nie = "0".substr($nie, 1); if($nie[0] == "Y") $nie = "1".substr($nie, 1); if($nie[0] == "Z") $nie = "2".substr($nie, 1); $dni = substr($nie, 0, -1); if(LETRA_NIF($dni) <> substr($nie, -1, 1)) return "Error: NIE erróneo"; return 1; } /***********************************************************************************/ function COMPROBAR_NIF($nif){ $nif = str_replace(" ", "", $nif); $nif = str_replace(".", "", $nif); $nif = str_replace("-", "", $nif); $nif = str_replace("_", "", $nif); $nif = str_replace(",", "", $nif); $dni = substr($nif, 0, -1); if(LETRA_NIF($dni) <> strtoupper(substr($nif, -1, 1))) return "Error: NIF erróneo"; return 1; } /***************************************************************************************************************/ function COMPROBAR_CIF($cif){ $cif = str_replace(" ", "", $cif); $cif = str_replace(".", "", $cif); $cif = str_replace("-", "", $cif); if(strlen($cif) <> 9) return "Error: Número de caracteres del CIF no es 9"; $validos = "ABCDEFGHJKLMNPQRSUVW"; if(!strstr($validos, substr($cif, 0, 1))) return "Error: Primera letra del CIF errónea"; if(!ctype_digit(substr($cif, 1, 7))) return "Error: Dígitos no numéricos en el CIF";
// Cálculo del dígito final $a = $cif[2] + $cif[4] + $cif[6]; for($i=1; $i<=7; $i=$i+2){ $x = $cif[$i] * 2; $x = sprintf('%02d', $x); $b += $x[0] + $x[1]; } $c = $a + $b; $c = sprintf('%02d', $c); $d = 10 - $c[1]; if($d == 10) $d = 0; $letras = array("J","A","B","C","D","E","F","G","H","I"); if($cif[8] <> $d && $cif[8] <> $letras[$d]) return "Error: CIF erróneo"; return 1; } /***************************************************************************************************************/ function LIMPIAR_NIF($nif){ $nif = str_replace(' ', '', $nif); $nif = str_replace('-', '', $nif); $nif = str_replace('/', '', $nif); $nif = str_replace('_', '', $nif); $nif = str_replace('.', '', $nif); $nif = str_replace(',', '', $nif); $nif = strtoupper($nif); return $nif; } /***************************************************************************************************************/ function LETRA_NIF($dni){ $dni = str_replace(" ", "", $dni); $dni = str_replace(".", "", $dni); $resto = (int) ($dni % 23); $letras = "TRWAGMYFPDXBNJZSQVHLCKE"; $letra = substr ($letras, $resto, 1); return $letra; } ?>
Saludos
|
Gracias me faltaba la parte dell algoritmo para comprobar los NIE (Offline), con esto listo.
Una cosa menos.
|