viernes, 2 de diciembre de 2011

Comprobar CIF NIF NIE con Php

Voy a mostrar una función muy útil para comprobar en Php si una cadena de texto es un CIF, NIF o NIE válido.

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

8 comentarios :

  1. muchas gracias Daweed; código muy limpio.

    dejo 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;

    ResponderEliminar
    Respuestas
    1. Falla comprobando los NIE. Al menos los que empiezan por Y. Devuelve 0 aunque sea correcto.

      Eliminar
  2. 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

    ResponderEliminar
  3. Buenas Daweed,

    Parece 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.

    ResponderEliminar
  4. En que archivo debo incluir este codigo ? o que debo hacer exactamente? podrias hacer un manual para torpes, para que ignorantes como yo, pudieran ejecutarlo sin problemas?. Gracias de antemano.

    ResponderEliminar
  5. Podrias hacer un manual para torpes, por que no se que debo hacer con este codigo, me refiero a ... En que archivo debo incluirlo.
    Me parece genial, pero no se como implementarlo. Gracias de antemano.

    ResponderEliminar
  6. Está mal para los CIFs. Por ejemplo, un CIF tipo B48896021 da un error de php.
    Como es lógico, el for ($i = 1; $i < 8; $i += 2) {
    $suma += substr((2 * $num[$i]),0,1) + substr((2 * $num[$i]),1,1);
    }
    está mal.

    ResponderEliminar