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