From 254e38c84c4d92fea40ee7a869e0ce87311333f0 Mon Sep 17 00:00:00 2001 From: "tcharlss@hotmail.fr" <> Date: Fri, 7 Dec 2012 20:28:37 +0000 Subject: [PATCH] =?UTF-8?q?Ajout=20d'une=20v=C3=A9rification=20pour=20un?= =?UTF-8?q?=20num=C3=A9ro=20ISBN=20pas=20d'options,=20peut-=C3=AAtre=20un?= =?UTF-8?q?=20num=C3=A9ro=20=C3=A0=2010=20ou=20=C3=A0=2013=20chiffres.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 1 + lang/verifier_fr.php | 7 +++ paquet.xml | 2 +- plugin.xml | 2 +- verifier/isbn.php | 124 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 verifier/isbn.php diff --git a/.gitattributes b/.gitattributes index f85b3e6..9cdfce9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -38,6 +38,7 @@ verifier/email.yaml -text verifier/entier.php -text verifier/entier.yaml -text verifier/id_document.php -text +verifier/isbn.php -text verifier/regex.php -text verifier/regex.yaml -text verifier/siren_siret.php -text diff --git a/lang/verifier_fr.php b/lang/verifier_fr.php index 9910276..d5d59d5 100644 --- a/lang/verifier_fr.php +++ b/lang/verifier_fr.php @@ -26,6 +26,13 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'erreur_entier_min' => 'La valeur doit être supérieure à @min@.', 'erreur_id_document' => 'Cet identifiant de document n\'est pas valide.', 'erreur_inconnue_generique' => 'Le format n\'est pas correct.', + 'erreur_isbn' => 'Le numéro ISBN n\'est pas valide (ex: 978-2-1234-5680-3 ou 2-1234-5680-X)', + 'erreur_isbn_13_X' => 'Un numéro ISBN-13 ne peut pas se terminer par X.', + 'erreur_isbn_nb_caracteres' => 'Le numéro ISBN doit comprendre 10 ou 13 caractères, sans compter les tirets (actuellement @nb@).', + 'erreur_isbn_nb_segments' => 'Le numéro ISBN doit comprendre 4 ou 5 segments (actuellement @nb@).', + 'erreur_isbn_G' => 'Le premier segment doit être égal à 978 ou 979.', + 'erreur_isbn_segment' => 'Le segment "@segment@" comprend @nb@ chiffre(s) en trop.', + 'erreur_isbn_segment_lettre' => 'Le segment "@segment@" ne doit pas contenir de lettre.', 'erreur_numerique' => 'Le format du nombre n\'est pas valide.', 'erreur_regex' => 'Le format de la chaîne n\'est pas valide.', 'erreur_siren' => 'Le numéro de SIREN n\'est pas valide.', diff --git a/paquet.xml b/paquet.xml index d2355dc..47e0646 100644 --- a/paquet.xml +++ b/paquet.xml @@ -1,7 +1,7 @@ <paquet prefix="verifier" categorie="outil" - version="0.1.18" + version="0.1.19" etat="test" compatibilite="[2.0.10;3.0.*]" logo="images/verifier-128.png" diff --git a/plugin.xml b/plugin.xml index 5cced23..1d10d1b 100644 --- a/plugin.xml +++ b/plugin.xml @@ -9,7 +9,7 @@ <auteur>[Les Développements Durables->http://www.ldd.fr]</auteur> <icon>images/verifier-128.png</icon> <licence>GPL v3</licence> - <version>0.1.18</version> + <version>0.1.19</version> <etat>test</etat> <description> <multi> diff --git a/verifier/isbn.php b/verifier/isbn.php new file mode 100644 index 0000000..aae7dcd --- /dev/null +++ b/verifier/isbn.php @@ -0,0 +1,124 @@ +<?php + +// Sécurité +if (!defined("_ECRIRE_INC_VERSION")) return; + +/** + * Validation d'un numero ISBN + * + * d apres https://fr.wikipedia.org/wiki/Numéro_ISBN + * ISBN-13 : longeur totale 13 caracteres divises en 5 segments de la forme G - A - B - C - K + * G: 3 caracteres (978 ou 979) + * A: de 1 a 5 caracteres (code de la zone geographique) + * B: de 1 a 7 caracteres (code de l editeur) + * C: de 1 a 6 caracteres, completes eventuellement par des 0 afin que le total-G soit egal a 10 caracteres (code du livre) + * K: 1 caractere entre 0 et 9 (cle de controle calculee d apres les autres chiffres) + * ex: 978-2-1234-5680-3 + * ISBN-10 : longeur totale 10 caracteres divises en 4 segments de la forme A -B -C -K + * A, B, C : idem ISBN-13 + * K: 1 caractere entre 0 et 9, ou X (cle de controle calculee d apres les autres chiffres) + * ex: 2-1234-5680-X + * + * Avec un numero ISBN comportant des tirets, on pourrait utiliser une regex + * pour verifier que chaque segment comporte le nombre adequat de caracteres. + * Cependant ca ne permet pas d indiquer precisement la nature de l erreur. + * La regex au cas ou : "/^(97[89][- ]){0,1}[0-9]{1,5}[- ][0-9]{1,7}[- ][0-9]{1,6}[- ][0-9X]$/" + * + * + * @param string $valeur + * La valeur à vérifier. + * @return string + * Retourne une chaine vide si c'est valide, sinon une chaine expliquant l'erreur. + */ + +function verifier_isbn_dist($valeur, $options=array()){ + + // dans tous les cas, on doit avoir 10 ou 13 caracteres (en enlevant les tirets) + $val['nb'] = $nb = strlen(preg_replace('/-/', '', $valeur)); + if (!preg_match("/10|13/", $nb)) { + return _T('verifier:erreur_isbn_nb_caracteres', $val); + } + + // un numero ISBN-13 ne peut pas se terminer par X + else if (preg_match("/^97[89].*X$/", $valeur)) { + return _T('verifier:erreur_isbn_13_X'); + } + + // s il y a le bon nombre de caracteres, on verifie qu il soient bien agences + else { + + // si le numero ISBN est decompose en segments par des tirets, verifier chaque segment + if (preg_match("/-/", $valeur)){ + + // d'abord on recupere les valeurs de chaque segment + $segments = explode("-", $valeur); + $val['nb'] = count($segments); + // ISBN-13 + if ($val['nb'] == 5) { + $isbn = 13; + $G = $segments[0]; + $A = $segments[1]; + $B = $segments[2]; + $C = $segments[3]; + $K = $segments[4]; + } + // ISBN-10 + else if ($val['nb'] == 4) { + $isbn = 10; + $A = $segments[0]; + $B = $segments[1]; + $C = $segments[2]; + $K = $segments[3]; + } + // on ne sait jamais + else { + return _T('verifier:erreur_isbn_nb_segments', $val); + } + + // puis ensuite, on verifie leur conformite + // G + if ($G AND !preg_match("/97[89]/", $G)) { + return _T('verifier:erreur_isbn_G'); + } + // pas de lettres pour A, B et C + foreach (array($A,$B,$C) as $segment){ + $val['segment'] = $segment; + if (!is_numeric($segment)) + return _T('verifier:erreur_isbn_segment_lettre', $val); + } + // A (code zone geographique) + if ($nbA = strlen($A) AND $nbA > 5) { + $val['nb'] = $nbA - 5; + $val['segment'] = $A; + return _T('verifier:erreur_isbn_segment', $val); + } + // B (code editeur) + if ($nbB = strlen($B) AND $nbB > 7) { + $val['nb'] = $nbB - 7; + $val['segment'] = $B; + return _T('verifier:erreur_isbn_segment', $val); + } + // C (code livre) + if ($nbC = strlen($C) AND $nbC > 6) { + $val['nb'] = $nbC - 6; + $val['segment'] = $C; + return _T('verifier:erreur_isbn_segment', $val); + } + // K (cle de controle) + if ($nbK = strlen($K) AND $nbK > 1) { + $val['nb'] = $nbK - 1; + $val['segment'] = $K; + return _T('verifier:erreur_isbn_segment', $val); + } + } + + // si le numero ISBN n a pas de tiret, on verifie au moyen d une regex + else { + // verification generique [978 ou 979] [9 chiffres] [1 chiffre ou lettre X] + if (!preg_match("/^(97[89]){0,1}[0-9]{1,9}[0-9X]$/", $valeur)) + return _T('verifier:erreur_isbn'); + } + } + + return ''; +} -- GitLab