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; |
} |
|