Volver a la página principal
miércoles 20 noviembre 2024
41

Cómo validar un DNI español con PHP

Validar un DNI (Documento Nacional de Identidad) español es un proceso que incluye verificar tanto el formato como la validez del número y la letra asociada. A continuación, se detalla un método en PHP para realizar esta validación.

Estructura del DNI

Un DNI español consta de 8 dígitos seguidos de una letra. Por ejemplo: 12345678Z.

  • Los primeros 8 caracteres son números.
  • El último carácter es una letra que se calcula en base a los números.

La letra se obtiene dividiendo los números del DNI entre 23, y usando el resto como índice para seleccionar la letra correspondiente en la secuencia:

TRWAGMYFPDXBNJZSQVHLCKE.

Implementación en PHP

Código para validar un DNI

function validarDNI($dni) {
    // Verificar el formato: 8 dígitos seguidos de una letra
    if (!preg_match('/^\d{8}[A-Z]$/', $dni)) {
        return false;
    }

    // Separar el número y la letra
    $numero = substr($dni, 0, 8);
    $letra = substr($dni, -1);

    // Letras válidas según el cálculo del módulo 23
    $letrasValidas = "TRWAGMYFPDXBNJZSQVHLCKE";

    // Calcular la letra correspondiente
    $letraCalculada = $letrasValidas[$numero % 23];

    // Comprobar si la letra es correcta
    return $letra === $letraCalculada;
}

Uso de la función

$dni = "12345678Z";

if (validarDNI($dni)) {
    echo "El DNI $dni es válido.";
} else {
    echo "El DNI $dni no es válido.";
}

Explicación del código

1. Formato:

Se utiliza una expresión regular (preg_match) para comprobar que el DNI tiene 8 dígitos seguidos de una letra mayúscula.

2. Cálculo de la letra:

La letra se calcula tomando el módulo 23 del número, y usando el resultado como índice en la cadena TRWAGMYFPDXBNJZSQVHLCKE.

3. Validación final:

Se compara la letra calculada con la letra proporcionada en el DNI.

Ejemplo práctico

Entrada válida

$dni = "12345678Z";  // Correcto, letra válida
echo validarDNI($dni) ? "Válido" : "Inválido";
// Salida: Válido

Entrada inválida

$dni = "12345678A";  // Incorrecto, letra no válida
echo validarDNI($dni) ? "Válido" : "Inválido";
// Salida: Inválido

Mejoras opcionales

1. Soporte para NIE (Número de Identidad de Extranjero):

El NIE tiene un formato similar al DNI, pero puede comenzar con las letras X, Y o Z.

Modificación para soportar NIE:

function validarNIE($nie) {
       if (preg_match('/^[XYZ]\d{7}[A-Z]$/', $nie)) {
           $nie = str_replace(['X', 'Y', 'Z'], [0, 1, 2], $nie);
       }
       return validarDNI($nie);
   }

2. Mensaje de error detallado:

Se puede añadir un sistema para devolver mensajes específicos (por ejemplo, "Formato incorrecto", "Letra inválida").

Etiquetas:
php
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer