Validar DNI (NIF), CIF, NIE

Os paso una función para validar DNI CIF NIE

/**
 * Validar DNI (NIF), CIF, NIE
 *
 * @param string $dni Numero de identificación
 *
 * @return bool Si es ok(true) o no(false)
 */
function validDniCifNie($dni){
  $cif = strtoupper($dni);
  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 false;
  }
  // 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 true;
    }else{
      return false;
    }
  }
  // Algoritmo para comprobacion de codigos tipo CIF
  $suma = $num[2] + $num[4] + $num[6];
  for ($i = 1; $i < 8; $i += 2){
    $suma += (int)substr((2 * $num[$i]),0,1) + (int)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 true;
    }else{
      return false;
    }
  }
  // Comprobacion de CIFs
  if (preg_match('/^[ABCDEFGHJNPQRSUVW]{1}/', $cif)){
    if ($num[8] == chr(64 + $n) || $num[8] == substr($n, strlen($n) - 1, 1)){
      return true;
    }else{
      return false;
    }
  }
  // Comprobacion de NIEs
  // T
  if (preg_match('/^[T]{1}/', $cif)){
    if ($num[8] == preg_match('/^[T]{1}[A-Z0-9]{8}$/', $cif)){
      return true;
    }else{
      return false;
    }
  }
  // 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 true;
    }else{
      return false;
    }
  }
  // Si todavía no se ha verificado devuelve error
  return false;
}

4 comentarios

  1. Lo has probado el script? Te invito a que lo compruebes con un NIE, por ejemplo:
    Y8506795Y
    Ya que lo has copiado de otra web, sería lo suyo que al menos comprobaras su funcionamiento completo.

    Si lo quieres, te paso la correción.

    • Hola Juan,
      Si he probado el script cuando me hacia falta y no me dio errores, acabo de probar con el que has pasado y da conforme es valido.
      Revisando en otras webs de validadores indica lo mismo que dicho NIE es valido.
      Cuando lo publique no mencione de donde es el código porque no recuerdo ya que hace mucho tiempo que lo tengo como puedes comprobar dicha publicación es del 2020 y hace mas tiempo que lo uso.

      Si puedes pásame la corrección y reviso.
      Muchas gracias por leer la pagina web, que tengas un buen día.
      Saludos

  2. No funciona con CIFs de empresas que no residen en España. La mayoría de los algoritmos no tienen en cuenta. Es una pena. Las únicas webs que funcionan, no tiene código, solo comprobación online.

    • Hola, para eso necesitarías tener una función por PAIS (ya que cada uno tiene sus validaciones), para poder validar teniendo en cuenta las 2 letras iniciales ej.: ESB12345678 o ADF-099999-G (Andorra), también existen paginas donde te dan una API y puedes hacer validaciones lo unico que son de pago.

Deja un comentario

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

Captcha cargando...