funcion para Validar el NIF, CIF y NIE en php


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 http://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”.
*Nota: dado que el algoritmo del dígito de control usado es secreto y jamás
ha sido publicado en fuentes oficiales del Estado se ha usado un algoritmo
obtenido por ingeniería inversa que ha logrado validar correctamente alrededor
de un millón de CIFs, NIFs y NIEs en total. Con lo que, presumiblemente, se
puede asumir que concuerda con el algoritmo de validación secreto original.

Este post ha sido traido de forma automatica desde https://web.archive.org/web/20140625063149/http:/bulma.net/body.phtml?nIdNoticia=2248 por un robot nigromante, si crees que puede mejorarse, por favor, contactanos.


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.