Es una función para validar todos los códigos fiscales que se usan en España. Analiza y verifica el tipo de código y entrega un valor indicativo.
Función para validar códigos NIF, CIF y NIE en PHP
Esta función clasifica y valida perfectamente todos* los códigos fiscales que se usan en España. Analiza una variable de 9 carácteres alfanuméricos y devuelve un valor numérico para cada tipo de código analizado donde todos los valores positivos (mayores que cero) indican que el código fiscal es correcto.
Los valores devueltos son:
Tipo: ??? NIF CIF NIE
Correcto: 1 2 3
Incorrecto: 0 -1 -2 -3
La función cumple con todas las especificaciones de las leyes españolas:
Decreto 2423/1975, de 25 de septiembre.
Real Decreto 338/1990, de 9 de marzo.
Real Decreto 1624/1992, de 29 de diciembre que modifica el 338/1990.
Real Decreto 155/1996, de 2 de febrero.
Orden de 3 de julio de 1998, por la que se modifica el Anexo del Decreto 2423/1975.
Real Decreto 1065/2007, de 27 de julio.
Orden EHA/451/2008, de 20 de febrero de 2008.
Orden INT/2058/2008, de 14 de julio de 2008.
Que es, actualmente, todo lo aprobado respecto con los Códigos de Identificación Fiscal, Número de Identificación Fiscal y Número de Identificación de Extranjeros.
He aquí la función:
function valida_nif_cif_nie($cif) {
//Copyright ©2005-2011 David Vidal Serra. Bajo licencia GNU GPL.
//Este software viene SIN NINGUN TIPO DE GARANTIA; para saber mas detalles
//puede consultar la licencia en https://www.gnu.org/licenses/gpl.txt(1)
//Esto es software libre, y puede ser usado y redistribuirdo de acuerdo
//con la condicion de que el autor jamas sera responsable de su uso.
//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 (!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 o como NIFs)
if (preg_match(‘/^[KLM]{1}/’, $cif))
{
if ($num[8] == chr(64 + $n) || $num[8] == substr(‘TRWAGMYFPDXBNJZSQVHLCKE’, substr($cif, 1, 8) % 23, 1))
{
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
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;
}
Puesto que siempre cabe la posibilidad de que el código fuente contenga algún error podéis pulsar aquí para mandarme un e-mail para que lo corrija. Agradecería que la información estuviese mínimamente documentada (por ejemplo el numero de cualquier nueva ley al respecto, o en caso de que un código fiscal no sea validado por la función pues que esté verídicamente contrastado…etc).
Agradecimientos:
– Luis P. Garrán, por el Real Decreto 1624/1992 y la especificación como NIF de los códigos con letras “K”, “L” y “M”.
– Lluis Rubio, por la nueva codificación de los NIE con letras “Y” y, en un futuro, “Z”.
– Jorge C. Hermoso Bernabéu, por las nuevas claves para entidades de la EHA/451/2008.
– Moises Gonzalez Sanchez, por descubrir la doble validación de los códigos con letras “K”, “L” y “M”.
[contact-form-7 id=”323″ ]
[contact-form-7 id=”324″ ]