El DNI a Espanya, consta de 8 dígits seguit de 1 lletra en majúscula. L'elecció de la lletra no és arbitraria i es calcula a partir de calcular el mòdulo resultant de dividir el número de DNI entre 23.
Això en dona una posició dins d'una taula estàndar de lletres. Simplement busquem a quina lletra correspon el número resultant i tindrem la lletra que li correspon al número
Per tant:
1. Ha de constar de 9 posicions:
2. La posició 1 a la 8 són nombre
3. La posició 9 és una lletra en majúscula
4. Si dividim el nombre entre 23 el mòdul ens dóna un nombre, que correspon a una posició de la taula de lletres. Si la lletra introduïda coincideix amb la lletra que ens indica la taula de lletres el DNI és correcte
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
T
|
R
|
W
|
A
|
G
|
M
|
Y
|
F
|
P
|
D
|
X
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
B
|
N
|
J
|
Z
|
S
|
Q
|
V
|
H
|
L
|
C
|
K
|
E
|
Suposem que volem validar si al número de DNI 12345678 li correspon la lletra Z: 12345678- Z
Calculem el mòdul de 23. 12345678 % 23 = 14.
La posició que ens dona és la 14. La busquem a la taula. La posició 14 és la Z per tant el DNI és correcte.
Com validar a PHP+HTML5
En primer lloc, usem HTML5 per usar els atributs required ( per obligar a entrar el camp) i pattern com a patrò de validació del camp:
<form action="Validar.php" method="post">
DNI
<input required type="text" name="DNI" pattern="\d{8}[A-Z]{1}" title="Has d'introduir un número de 8 posicions" placeholder="8 números i 1 lletra majúscula" /><br>
<input type="submit" name="Enviar" value="Enviar">
</form>
L'expressió regular \d{8}[A-Z]{1} ens indica que volem 8 dígits seguit d'una lletra en majúscules
Un cop enviat el formulari , agafem les 8 primeres posicions
$numero=substr($valor,0,8);
Agafem la última posició que correspon a la lletra
$lletra=substr($valor,-1);
Calculem el mòdul
$posicio=$numero%23;
Busquem a quina posició correspon a la taula
$cadena="TRWAGMYFPDXBNJZSQVHLCKET";
$lletra2=substr($cadena,$posicio,1);
Finalment comparem la lletra que ens han entrat amb la que hem calculat. Si són iguals, el DNI és correcte.
Finalment , el codi sencer:
<!DOCTYPE html> <html lang="es"> <!-- capçalera --> <head> <meta charset="UTF-8" /> <meta name="description" content="Formularis HTML5"> <meta name="keywords" content="HTML5"> <meta name="author" content="DeveloperMobilesWeb"> <title>Exemple de camps amb HTML5</title> </head> <!-- cos del document--> <body> <?php function validarDNI($valor){ $numero=substr($valor,0,8); $lletra=substr($valor,-1); $cadena="TRWAGMYFPDXBNJZSQVHLCKET"; $posicio=$numero%23; $lletra2=substr($cadena,$posicio,1); if ($lletra==$lletra2){ return "valid"; }else { return "no valid"; } } if (isset($_REQUEST['Enviar'])){ echo validarDNI($_REQUEST['DNI']); } else {?> <form action="Validar.php" method="post"> DNI <input required type="text" name="DNI" pattern="\d{8}[A-Z]{1}" title="Has d'introduir un número de 8 posicions" placeholder="8 números i 1 lletra majúscula" /><br> <input type="submit" name="Enviar" value="Enviar"> </form> <?php } ?> </body> <html>
Cap comentari:
Publica un comentari a l'entrada