Categories: PHPTips

Validación de CIF-NIF

Cuando se necesita validar un CIF-NIF lo primero que te viene a la cabeza es que hay varios tipos, no me voy a explayar, esta todo muy bien explicado en la Wikipedia:

El caso es que es la típica historia que empaquetas en una función y te olvidas:

function cif_validation ($cif) {
  $cif = strtoupper($cif);
  if (preg_match('~(^[XYZ\d]\d{7})([TRWAGMYFPDXBNJZSQVHLCKE]$)~', $cif, $parts)) {
    $control = 'TRWAGMYFPDXBNJZSQVHLCKE';
    $nie = array('X', 'Y', 'Z');
    $parts[1] = str_replace(array_values($nie), array_keys($nie), $parts[1]);
    $cheksum = substr($control, $parts[1] % 23, 1);
    return ($parts[2] == $cheksum);
  } elseif (preg_match('~(^[ABCDEFGHIJKLMUV])(\d{7})(\d$)~', $cif, $parts)) {
    $checksum = 0;
    foreach (str_split($parts[2]) as $pos => $val) {
      $checksum += array_sum(str_split($val * (2 - ($pos % 2))));
    }
    $checksum = ((10 - ($checksum % 10)) % 10);
    return ($parts[3] == $checksum);
  } elseif (preg_match('~(^[KLMNPQRSW])(\d{7})([JABCDEFGHI]$)~', $cif, $parts)) {
    $control = 'JABCDEFGHI';
    $checksum = 0;
    foreach (str_split($parts[2]) as $pos => $val) {
      $checksum += array_sum(str_split($val * (2 - ($pos % 2))));
    }
    $checksum = substr($control, ((10 - ($checksum % 10)) % 10), 1);
    return ($parts[3] == $checksum);
  }
  return false;
}

El funcionamiento es tan sencillo como llamar a la función con un CIF-NIF y te devuelve true o false según sea válido o no.

Saludos

alpha

Share
Published by
alpha

Recent Posts

Apuntes de electrónica: Condensador y Bobina en alterna

Hace ya tiempo de mi última entrada de apuntes de electrónica. Fue la entrada sobre…

3 years ago

Review: Zoyi ZT-300AB Multimeter

Looking for cheap multimeters I found the Zoyi ZT-300AB, for about €20 we have a…

3 years ago

Zoyi multimeters, courtesy of Zotek Instruments

In my search for interesting multimeters I came across a manufacturer whose multimeters were sold…

3 years ago

Los productos remarcados

Desde que la industria empezó a deslocalizar sus fabricas llevando gran parte del peso de…

3 years ago

Análisis: Pinza amperimétrica Mestek CM83C

Desde que vi por primera vez una pinza amperimétrica quise tener una. Con la aparición…

3 years ago

Silencio

De lejos nos agobia, la distancia se hace notar con el silencio, de cerca es…

3 years ago