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.
Un DNI español consta de 8 dígitos seguidos de una letra. Por ejemplo: 12345678Z
.
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
.
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;
}
$dni = "12345678Z";
if (validarDNI($dni)) {
echo "El DNI $dni es válido.";
} else {
echo "El DNI $dni no es válido.";
}
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.
$dni = "12345678Z"; // Correcto, letra válida
echo validarDNI($dni) ? "Válido" : "Inválido";
// Salida: Válido
$dni = "12345678A"; // Incorrecto, letra no válida
echo validarDNI($dni) ? "Válido" : "Inválido";
// Salida: Inválido
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").
Jorge García
Fullstack developer