Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1485 → Rev 1486

/trunk/jrest/lib/RechercheInfosTaxonBeta.php
71,26 → 71,84
}
public function rechercherInformationsComplementairesSurNom($nom_saisi) {
$nom_saisi = trim($this->supprimerAccents($nom_saisi));
// Essai de recherche sur le nom saisi tel quel
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi, true);
if(empty($liste_genre_espece)) {
// Essai de recherche stricte en tentant de supprimer le nom d'auteur
$nom_saisi_sans_auteur = $this->supprimerAuteur($nom_saisi);
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi_sans_auteur, true);
if(empty($liste_genre_espece)) {
// Dernière tentative : essai de recherche étendue
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi, false);
}
}
return $liste_genre_espece;
}
private function effectuerRequeteUrlRecherche($nom_saisi, $stricte = true) {
$url_recherche = $this->getUrlRechercheInfosComplementaires($nom_saisi, $stricte);
$resultat = @file_get_contents($url_recherche);
$liste_genre_espece = array();
if($resultat != '') {
$liste_genre_espece = $this->parserResultatRechercheTaxon($resultat);
}
return $liste_genre_espece;
}
private function getUrlRechercheInfosComplementaires($nom_saisi, $stricte = true) {
$type_recherche = $stricte ? 'stricte' : 'etendue';
return $url_recherche_etendue = $this->url_service_nom.'?masque='.urlencode($nom_saisi).'&recherche='.$type_recherche.'&ns.format=txt&retour.champs=nom_sci,auteur,nom_retenu.id&navigation.limite=1';
}
//TODO: déplacer les fonctions ci dessus et dessous dans une classe
// utilitaire
private function supprimerAccents($str, $charset = 'UTF-8')
{
$str = htmlentities($str, ENT_NOQUOTES, $charset);
$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. 'œ'
$str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères
 
return $str;
}
private function supprimerAuteur($nom_saisi) {
// 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
// TODO: gérer les hybrides
$nameparser = new NameParser();
$nom_decoupe = $nameparser->parse($nom_saisi);
$masque = ((isset($nom_decoupe['genus']) && $nom_decoupe['genus']!= '') &&
(isset($nom_decoupe['species']) && $nom_decoupe['species']!= ''))
? $nom_decoupe['genus'].' '.$nom_decoupe['species'] : $nom_saisi;
if($this->estUnHybride($nom_saisi) || $this->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));
} else {
$auteur = $nameparser->parse_auth($nom_saisi);
$nom_saisi_sans_auteur = str_replace($auteur, '', $nom_saisi);
}
 
$nom_saisi_sans_auteur = trim($nom_saisi_sans_auteur);
return $nom_saisi_sans_auteur;
}
private function estUneFormuleHybridite($nom_saisi) {
return strpos($nom_saisi,' x ') !== false;
}
private function estUnHybride($nom_saisi) {
return strpos($nom_saisi,'x ') === 0;
}
private function parserResultatRechercheTaxon($resultat) {
$liste_genre_espece = array();
$url = $this->url_service_nom.'?masque='.urlencode($nom_decoupe['genus'].' '.$nom_decoupe['species']).'&recherche=etendue&ns.format=txt&retour.champs=nom_sci,auteur,nom_retenu.id&navigation.limite=1';
$resultat = @file_get_contents($url);
if($resultat != '') {
$resultat = json_decode($resultat);
if(is_object($resultat) && isset($resultat->resultat)) {
foreach ($resultat->resultat as $id => $res) {
$nom_complet = $res->{'nom_sci'}.' '.$res->auteur;
$liste_genre_espece[] = array($id,$nom_complet);
}
$resultat = json_decode($resultat);
if(is_object($resultat) && isset($resultat->resultat)) {
foreach ($resultat->resultat as $id => $res) {
$nom_complet = $res->{'nom_sci'}.' '.$res->auteur;
$liste_genre_espece[] = array($id,$nom_complet);
}
}
}
return $liste_genre_espece;
}