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.
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;
}
?>