0; */ // f. suivi de 1 mot sauf, "Rosa pomifera f. x longicruris" (2) /*if( ($q = strpos($nom_saisi, ' f. ', $p - 2)) ) { $after = max($after, strpos($nom_saisi, ' ', $q + 4)); // premier espace après ' f. ' }*/ $after = max($after, self::getSpaceNoAfter($nom_saisi, ' f. ', $p - 2)); // " var. " // var. n'est pas un repère vraiment adéquat, on sait juste qu'il fait partie du nom sci // $after = min($strip_pos, strpos($nom_saisi, ' var. ')); $after = max($after, self::getSpaceNoAfter($nom_saisi, ' var. ', $p - 4)); // " subsp. " // après subsp.: le plus souvent un ' x ', donc pas vraiment de règle (1 ou 2 mots) $after = max($after, self::getSpaceNoAfter($nom_saisi, ' subsp. ', $p - 6)); // AUTEUR "." // autrement, avant un "." dans la partie auteur, il peut y avoir entre 1 et 7 mots à gauche // grep -o '^[^.]*\.' liste-auteur.txt|while read f; do grep -o ' '<<<"$f"|wc -l; done|sort -n|tail -1 if(!$after) { // si le "." rencontré n'est pas l'un du "nom_sci", c'est de "auteur" $before = min($before, $p); } } if( ($p = strpos($nom_saisi, ' x ')) ) { $after = max($after, strpos($nom_saisi, ' x ', $p + 3)); } // " (L.)" et " L." if( ($p = strpos($nom_saisi, ' (L.)')) ) { $before = min($before, $p); } // note: on supprime le " L." en amont // if( ($p = strpos($nom_saisi, ' L.')) ) $before = min($before, $p); // "(" et ")", uniquement dans nom_sci dans le cadre de " Gp)", autrement: auteur // XXX: ce cas englobe " (L.)" if( ($p = strpos($nom_saisi, '(')) ) { $before = min($before, $p); } // TODO: gérer le " sp." [taxon supérieur], pour l'instant return FALSE if( ($p = strpos($nom_saisi, ' sp.')) ) { return FALSE; } // TODO: idem if( ($p = strpos($nom_saisi, ' sp ')) ) { return FALSE; } // si "&": auteur, et entre 1 et 10 mots à gauche // grep -o '^[^&]*&' liste-auteur.txt|while read f; do grep -o ' '<<<"$f"|wc -l; done|sort -n|tail -1 // si ",": auteur, et entre 1 et 5 mots à gauche // grep -o '^[^,]*,' liste-auteur.txt|while read f; do grep -o ' '<<<"$f"|wc -l; done|sort -n|tail -1 // TRIM auteurs: // sed -e 's/[()]//g' liste-auteur.txt|awk '{print $1}'|sed -e 's/[ .,]*$//g'|awk '{print $1}'|sed -r '/^.{0,3}$/d'|sort -u|wc -l sendAuthor: $x = self::contientAuteur($nom_saisi, $after, $auteur); if($x) { $n = substr($nom_saisi, 0, min($before, strpos($nom_saisi, $auteur[1]))); $auteur = trim(substr($nom_saisi, strlen($n))); return trim($n, " \t\n\r\0\x0B(),.&"); } return FALSE; } static function contientAuteur($nom_saisi, $start, &$auteur = NULL) { static $auteurs; // XXX: PHP-5.3 // $auteurs = file_get_contents(dirname(__FILE__) . "/../static/auteurs-bdtfx.min.txt"); $auteurs = file_get_contents(__DIR__ . "/auteurs-bdtfx.min.txt") or die('no file: auteurs-bdtfx.min.txt'); return preg_match('^\s(' . $auteurs . ')^S', $nom_saisi, $auteur, 0, $start); } static function supprimerAuteur($nom_saisi, &$auteur = null) { // TODO: gérer les hybrides if(self::estUnHybride($nom_saisi) || self::estUneFormuleHybridite($nom_saisi)) { $nom_decoupe = explode(' ', $nom_saisi); $derniere_position_hybride = end(array_keys($nom_decoupe, 'x')); $nom_saisi_sans_auteur = implode(' ',array_slice($nom_decoupe, 0, $derniere_position_hybride + 2)); /* var_dump($nom_saisi, $nom_decoupe, $derniere_position_hybride, $nom_saisi_sans_auteur); if($auteur != NULL) { $c = strpos($nom_saisi, ' x '); $auteur = substr($nom_saisi, $c + 3); return substr($nom_saisi, 0, $c); } var_dump(substr($nom_saisi, 0, strpos($nom_saisi, ' x '))); echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n";*/ } else { /* Attention le parseur de nom n'est pas fiable à 100% mais ça marche dans la plupart des cas à part les formules d'hybridité saisies avec un auteur */ $nameparser = new NameParser(); $auteur = $nameparser->parse_auth($nom_saisi); $nom_saisi_sans_auteur = str_replace($auteur, '', $nom_saisi); } return trim($nom_saisi_sans_auteur); } static function estUneFormuleHybridite($nom_saisi) { return strpos($nom_saisi,' x ') !== false; } static function estUnHybride($nom_saisi) { return strpos($nom_saisi,'x ') === 0; } }