Server : Apache System : Linux webd348.cluster026.gra.hosting.ovh.net 5.15.148-ovh-vps-grsec-zfs-classid #1 SMP Thu Feb 8 09:41:04 UTC 2024 x86_64 User : hednacluml ( 122243) PHP Version : 8.3.9 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl Directory : /home/hednacluml/jobs/plugins/auto/verifier/verifier/ |
<?php /** * API de vérification : vérification de la validité d'un numéro ISBN * * @plugin verifier * @copyright 2018 * @author Les Développements Durables * @licence GNU/GPL */ // Sécurité if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Validation d'un numéro ISBN * * d'après 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 numéro ISBN comportant des tirets, on pourrait utiliser une regex * pour vérifier que chaque segment comporte le nombre adequat de caractères. * Cependant ça ne permet pas d'indiquer précisement 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 = []) { // 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); } elseif (preg_match('/^97[89].*X$/', $valeur)) { // un numero ISBN-13 ne peut pas se terminer par X return _T('verifier:erreur_isbn_13_X'); } else { // s il y a le bon nombre de caracteres, on verifie qu il soient bien agences // 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]; } elseif ($val['nb'] == 4) { // ISBN-10 $isbn = 10; $G = '';//Pas de $G en ISBN 10 $A = $segments[0]; $B = $segments[1]; $C = $segments[2]; $K = $segments[3]; } else { // nombre de segments incorrect (on ne sait jamais) return _T('verifier:erreur_isbn_nb_segments', $val); } // puis ensuite, on verifie leur conformite // G : 978 ou 979 if ($G && !preg_match('/97[89]/', $G)) { return _T('verifier:erreur_isbn_G'); } // A, B et C doivent contenir des chiffres foreach ([$A,$B,$C] as $segment) { $val['segment'] = $segment; if (!is_numeric($segment)) { return _T('verifier:erreur_isbn_segment_lettre', $val); } } // A (code zone geographique) : 5 caracteres max if (($nbA = strlen($A)) && $nbA > 5) { $val['nb'] = $nbA - 5; $val['segment'] = $A; return _T('verifier:erreur_isbn_segment', $val); } // B (code editeur) : 7 caracteres max if (($nbB = strlen($B)) && $nbB > 7) { $val['nb'] = $nbB - 7; $val['segment'] = $B; return _T('verifier:erreur_isbn_segment', $val); } // C (code livre) : 6 caracteres max if (($nbC = strlen($C)) && $nbC > 6) { $val['nb'] = $nbC - 6; $val['segment'] = $C; return _T('verifier:erreur_isbn_segment', $val); } // K (cle de controle) : 1 caractere max if (($nbK = strlen($K)) && $nbK > 1) { $val['nb'] = $nbK - 1; $val['segment'] = $K; return _T('verifier:erreur_isbn_segment', $val); } } else { // si le numero ISBN n a pas de tiret, on verifie au moyen d une regex // 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 ''; }