Skip to content
Extraits de code Groupes Projets
Valider 254e38c8 rédigé par tcharlss@hotmail.fr's avatar tcharlss@hotmail.fr
Parcourir les fichiers

Ajout d'une vérification pour un numéro ISBN

pas d'options, peut-être un numéro à 10 ou à 13 chiffres.
parent ee02ca62
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -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
......
......@@ -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.',
......
<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"
......
......@@ -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>
......
<?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 '';
}
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter