Su uso es muy sencillo, simplemente se hace la llamada a la función pasandola como parametro la cadena que queremos verificar y la función nos devolvera unos de los siguientes valores: 1 = NIF correcto, 2 = CIF correcto, 3 = NIE correcto, -1 = NIF incorrecto, -2 = CIF incorrecto, -3 = NIE incorrecto, 0 = ??? incorrecto.
function check_nif_cif_nie($cif) {
//Returns:
// 1 = NIF ok,
// 2 = CIF ok,
// 3 = NIE ok,
//-1 = NIF bad,
//-2 = CIF bad,
//-3 = NIE bad, 0 = ??? bad $cif = strtoupper($cif); for ($i = 0; $i < 9; $i ++){ $num[$i] = substr($cif, $i, 1); } //si no tiene un formato valido devuelve error if (!ereg('((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^
[0-9]{8}[A-Z]{1}$)', $cif)){
return 0;
}
//comprobacion de NIFs estandar
if (ereg('(^[0-9]{8}[A-Z]{1}$)', $cif)){
if ($num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE',
substr($cif, 0, 8) % 23, 1)){
return 1;
}else {
return -1;
}
}
//algoritmo para comprobacion de codigos tipo CIF
$suma = $num[2] + $num[4] + $num[6];
for ($i = 1; $i < 8; $i += 2){
$suma += substr((2 * $num[$i]),0,1) +
substr((2 * $num[$i]),1,1); } $n = 10 - substr($suma, strlen($suma) - 1, 1); //comprobacion de NIFs especiales (se calculan como CIFs) if (ereg('^[KLM]{1}', $cif)){ if ($num[8] == chr(64 + $n)){ return 1; }else{ return -1; } } //comprobacion de CIFs if (ereg('^[ABCDEFGHJNPQRSUVW]{1}', $cif)){ if ($num[8] == chr(64 + $n) || $num[8] ==
substr($n, strlen($n) - 1, 1)){ return 2; }else{ return -2; } } //comprobacion de NIEs //T if (ereg('^[T]{1}', $cif)){ if ($num[8] == ereg('^[T]{1}[A-Z0-9]{8}$', $cif)){ return 3; }else{ return -3; } } //XYZ if (ereg('^[XYZ]{1}', $cif)){ if ($num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE',
substr(str_replace(array('X','Y','Z'),
array('0','1','2'), $cif), 0, 8) % 23, 1)){
return 3;
}else{
return -3;
}
}
//si todavia no se ha verificado devuelve error
return 0;
}
Es lo que estaba buscando, gracias
ResponderEliminarmuchas gracias Daweed; código muy limpio.
ResponderEliminardejo la misma función solo cambiando ereg por preg_match para adaptarlo a php 5.3
$cif = strtoupper($str);
for ($i = 0; $i < 9; $i ++){
$num[$i] = substr($cif, $i, 1);
}
//si no tiene un formato valido devuelve error
if (!preg_match('/((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)/', $cif)){
return 0;
}
//comprobacion de NIFs estandar
if (preg_match('/(^[0-9]{8}[A-Z]{1}$)/', $cif)){
if ($num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE', substr($cif, 0, 8) % 23, 1)){
return 1;
} else {
return -1;
}
}
//algoritmo para comprobacion de codigos tipo CIF
$suma = $num[2] + $num[4] + $num[6];
for ($i = 1; $i < 8; $i += 2){
$suma += substr((2 * $num[$i]),0,1) + substr((2 * $num[$i]),1,1);
}
$n = 10 - substr($suma, strlen($suma) - 1, 1);
//comprobacion de NIFs especiales (se calculan como CIFs)
if (preg_match('/^[KLM]{1}/', $cif)){
if ($num[8] == chr(64 + $n)){
return 1;
}else{
return -1;
}
}
//comprobacion de CIFs
if (preg_match('/^[ABCDEFGHJNPQRSUVW]{1}/', $cif)){
if ($num[8] == chr(64 + $n) || $num[8] == substr($n, strlen($n) - 1, 1)){
return 2;
}else{
return -2;
}
}
//comprobacion de NIEs
//T
if (preg_match('/^[T]{1}/', $cif)){
if ($num[8] == preg_match('/^[T]{1}[A-Z0-9]{8}$/', $cif)){
return 3;
}else{
return -3;
}
}
//XYZ
if (preg_match('/^[XYZ]{1}/', $cif)){
if ($num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE', substr(str_replace(array('X','Y','Z'), array('0','1','2'), $cif), 0, 8) % 23, 1)){
return 3;
}else{
return -3;
}
}
//si todavia no se ha verificado devuelve error
return 0;
Gracias por tu aportacion!!. Aunque todo hay que decirlo, el codigo no es mio, lo tengo recopilado hace mucho tiempo y no tengo quien lo hizo
ResponderEliminarBuenas Daweed,
ResponderEliminarParece ser que la función original (http://bulma.net/body.phtml?nIdNoticia=2248) es de David Vidal Serra. Es igual que esta, solamente cambia el nombre.