[PLUGINS] ~maj globale
[lhc/web/www.git] / www / plugins / verifier / verifier / isbn.php
1 <?php
2
3 // Sécurité
4 if (!defined('_ECRIRE_INC_VERSION')) {
5 return;
6 }
7
8 /**
9 * Validation d'un numero ISBN
10 *
11 * d apres https://fr.wikipedia.org/wiki/Numéro_ISBN
12 * ISBN-13 : longeur totale 13 caracteres divises en 5 segments de la forme G - A - B - C - K
13 * G: 3 caracteres (978 ou 979)
14 * A: de 1 a 5 caracteres (code de la zone geographique)
15 * B: de 1 a 7 caracteres (code de l editeur)
16 * C: de 1 a 6 caracteres, completes eventuellement par des 0 afin que le total-G soit egal a 10 caracteres (code du livre)
17 * K: 1 caractere entre 0 et 9 (cle de controle calculee d apres les autres chiffres)
18 * ex: 978-2-1234-5680-3
19 * ISBN-10 : longeur totale 10 caracteres divises en 4 segments de la forme A -B -C -K
20 * A, B, C : idem ISBN-13
21 * K: 1 caractere entre 0 et 9, ou X (cle de controle calculee d apres les autres chiffres)
22 * ex: 2-1234-5680-X
23 *
24 * Avec un numero ISBN comportant des tirets, on pourrait utiliser une regex
25 * pour verifier que chaque segment comporte le nombre adequat de caracteres.
26 * Cependant ca ne permet pas d indiquer precisement la nature de l erreur.
27 * La regex au cas ou : "/^(97[89][- ]){0,1}[0-9]{1,5}[- ][0-9]{1,7}[- ][0-9]{1,6}[- ][0-9X]$/"
28 *
29 *
30 * @param string $valeur
31 * La valeur à vérifier.
32 * @return string
33 * Retourne une chaine vide si c'est valide, sinon une chaine expliquant l'erreur.
34 */
35
36 function verifier_isbn_dist($valeur, $options = array()) {
37
38 // dans tous les cas, on doit avoir 10 ou 13 caracteres (en enlevant les tirets)
39 $val['nb'] = $nb = strlen(preg_replace('/-/', '', $valeur));
40 if (!preg_match('/10|13/', $nb)) {
41 return _T('verifier:erreur_isbn_nb_caracteres', $val);
42 } else if (preg_match('/^97[89].*X$/', $valeur)) {
43 // un numero ISBN-13 ne peut pas se terminer par X
44 return _T('verifier:erreur_isbn_13_X');
45 } else {
46 // s il y a le bon nombre de caracteres, on verifie qu il soient bien agences
47 // si le numero ISBN est decompose en segments par des tirets, verifier chaque segment
48 if (preg_match('/-/', $valeur)) {
49 // d'abord on recupere les valeurs de chaque segment
50 $segments = explode('-', $valeur);
51 $val['nb'] = count($segments);
52 // ISBN-13
53 if ($val['nb'] == 5) {
54 $isbn = 13;
55 $G = $segments[0];
56 $A = $segments[1];
57 $B = $segments[2];
58 $C = $segments[3];
59 $K = $segments[4];
60 } elseif ($val['nb'] == 4) {
61 // ISBN-10
62 $isbn = 10;
63 $A = $segments[0];
64 $B = $segments[1];
65 $C = $segments[2];
66 $K = $segments[3];
67 } else {
68 // nombre de segments incorrect (on ne sait jamais)
69 return _T('verifier:erreur_isbn_nb_segments', $val);
70 }
71
72 // puis ensuite, on verifie leur conformite
73 // G : 978 ou 979
74 if ($G and !preg_match('/97[89]/', $G)) {
75 return _T('verifier:erreur_isbn_G');
76 }
77 // A, B et C doivent contenir des chiffres
78 foreach (array($A,$B,$C) as $segment) {
79 $val['segment'] = $segment;
80 if (!is_numeric($segment)) {
81 return _T('verifier:erreur_isbn_segment_lettre', $val);
82 }
83 }
84 // A (code zone geographique) : 5 caracteres max
85 if ($nbA = strlen($A) and $nbA > 5) {
86 $val['nb'] = $nbA - 5;
87 $val['segment'] = $A;
88 return _T('verifier:erreur_isbn_segment', $val);
89 }
90 // B (code editeur) : 7 caracteres max
91 if ($nbB = strlen($B) and $nbB > 7) {
92 $val['nb'] = $nbB - 7;
93 $val['segment'] = $B;
94 return _T('verifier:erreur_isbn_segment', $val);
95 }
96 // C (code livre) : 6 caracteres max
97 if ($nbC = strlen($C) and $nbC > 6) {
98 $val['nb'] = $nbC - 6;
99 $val['segment'] = $C;
100 return _T('verifier:erreur_isbn_segment', $val);
101 }
102 // K (cle de controle) : 1 caractere max
103 if ($nbK = strlen($K) and $nbK > 1) {
104 $val['nb'] = $nbK - 1;
105 $val['segment'] = $K;
106 return _T('verifier:erreur_isbn_segment', $val);
107 }
108 } else {
109 // si le numero ISBN n a pas de tiret, on verifie au moyen d une regex
110 // verification generique [978 ou 979] [9 chiffres] [1 chiffre ou lettre X]
111 if (!preg_match('/^(97[89]){0,1}[0-9]{1,9}[0-9X]$/', $valeur)) {
112 return _T('verifier:erreur_isbn');
113 }
114 }
115 }
116
117 return '';
118 }