Indicar si un NIF o CIF es válido

Código PHP

PHP – Validaciones – nif, cif

Función que valida un NIF o CIF español.

/**
 * Class HelperValidate
 */
abstract class HelperValidate
{
    /**
     * Indica si un NIF/CIF es válido
     *
     * @param $str
     *
     * @return bool
     */
    public static function isNif($str) : bool
    {
        /* normalizamos el formato */
        $str = preg_replace('/[^0-9A-Z]/i', '', $str);
        
        /* El formato es de un NIF o un NIE */
        if (preg_match('/X?[0-9]{8}[A-Z]/i', $str)) {
            
            /* para no duplicar código, eliminamos la X 
               en el caso de que sea un NIE */
            $str = preg_replace('/^X/i', '', $str);
  
            /* calculamos que letra corresponde 
               al número del DNI o NIE  */
   
            $stack = 'TRWAGMYFPDXBNJZSQVHLCKE';
            $pos   = substr($str, 0, 8) % 23;
            
            if (strtoupper(substr($str, 8, 1)) == substr($stack, $pos, 1)) {
                return true;
            }
        } /* El formato es el de un CIF  */
        else {
            
             /* CIF */
            if (preg_match('/[A-HK-NPQS][0-9]{7}[A-J0-9]/i', $str))  {
                
                $sum = 0;
                
                /* sumar los digitos en posiciones pares */
                for ($i = 2; $i < strlen($str) - 1; $i += 2) {
                    $sum += substr($str, $i, 1);
                }
                
                /* Multiplicar los digitos en posiciones impares 
                   por 2 y sumar los digitos del resultado */
                for ($i = 1; $i < strlen($str) - 1; $i += 2) {
  
                    $t = substr($str, $i, 1) * 2;
   
                    /* agrega la suma de los digitos del 
                       resultado de la multiplicación */
                    $sum += ($t > 9) ? ($t - 9) : $t;
                }
                
                /* Restamos el último digito de la suma actual 
                   a 10 para obtener el control */
  
                $control = 10 - ($sum % 10);
                
                /* El control puede ser un número o una letra */
                if (substr($str, 8, 1) == $control ||
                    strtoupper(substr($str, 8, 1)) == 
                                substr('JABCDEFGHI', $control, 1)) {
                    return true;
                }
                
                return false;
            }
        }
        
        return false;
    }
}