Subversion Repositories eFlore/Applications.cel

Rev

Rev 1432 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1432 Rev 1486
Line 69... Line 69...
69
		
69
		
70
		return $retour_infos_complementaires;
70
		return $retour_infos_complementaires;
Line 71... Line 71...
71
	}
71
	}
72
	
-
 
-
 
72
	
-
 
73
	public function rechercherInformationsComplementairesSurNom($nom_saisi) {
-
 
74
		$nom_saisi = trim($this->supprimerAccents($nom_saisi));
73
	public function rechercherInformationsComplementairesSurNom($nom_saisi) {
75
		// Essai de recherche sur le nom saisi tel quel
-
 
76
		$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi, true);
74
		
77
		if(empty($liste_genre_espece)) {
75
		$nameparser = new NameParser();
-
 
76
		$nom_decoupe = $nameparser->parse($nom_saisi);
78
			// Essai de recherche stricte en tentant de supprimer le nom d'auteur
-
 
79
			$nom_saisi_sans_auteur = $this->supprimerAuteur($nom_saisi);
77
		
80
			$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi_sans_auteur, true);
78
		$masque = ((isset($nom_decoupe['genus']) && $nom_decoupe['genus']!= '') && 
81
			if(empty($liste_genre_espece)) {
-
 
82
				// Dernière tentative : essai de recherche étendue
-
 
83
				$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi, false);
-
 
84
			}
-
 
85
		}
79
				  (isset($nom_decoupe['species']) && $nom_decoupe['species']!= ''))
86
		return $liste_genre_espece;
-
 
87
	}
-
 
88
	
-
 
89
	private function effectuerRequeteUrlRecherche($nom_saisi, $stricte = true) {
80
				  ? $nom_decoupe['genus'].' '.$nom_decoupe['species'] : $nom_saisi;
90
		$url_recherche = $this->getUrlRechercheInfosComplementaires($nom_saisi, $stricte);
81
		
-
 
82
		$liste_genre_espece = array();
-
 
83
		$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';
91
		$resultat = @file_get_contents($url_recherche);
-
 
92
		$liste_genre_espece = array();
-
 
93
		if($resultat != '') {
-
 
94
			$liste_genre_espece = $this->parserResultatRechercheTaxon($resultat);
-
 
95
		}
-
 
96
		return $liste_genre_espece;
-
 
97
	}
-
 
98
	
-
 
99
	private function getUrlRechercheInfosComplementaires($nom_saisi, $stricte = true) {
-
 
100
		$type_recherche = $stricte ? 'stricte' : 'etendue';
-
 
101
		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';
-
 
102
	}
-
 
103
	
-
 
104
	//TODO: déplacer les fonctions ci dessus et dessous dans une classe
-
 
105
	// utilitaire
-
 
106
	private function supprimerAccents($str, $charset = 'UTF-8')
-
 
107
	{
-
 
108
		$str = htmlentities($str, ENT_NOQUOTES, $charset);
-
 
109
		$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
-
 
110
		$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. 'œ'
-
 
111
		$str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères
-
 
112
 
-
 
113
		return $str;
-
 
114
	}
-
 
115
	
-
 
116
	private function supprimerAuteur($nom_saisi) {
-
 
117
		// Attention le parseur de nom n'est pas fiable à 100%
-
 
118
		// mais ça marche dans la plupart des cas	
-
 
119
		// à part les formules d'hybridité saisies avec un auteur
-
 
120
		// TODO: gérer les hybrides
-
 
121
		$nameparser = new NameParser();
-
 
122
		if($this->estUnHybride($nom_saisi) || $this->estUneFormuleHybridite($nom_saisi)) {
-
 
123
			$nom_decoupe = explode(' ', $nom_saisi);
-
 
124
			$derniere_position_hybride = end(array_keys($nom_decoupe, 'x'));
-
 
125
			$nom_saisi_sans_auteur = implode(' ',array_slice($nom_decoupe, 0, $derniere_position_hybride + 2));
-
 
126
		} else {
-
 
127
			$auteur = $nameparser->parse_auth($nom_saisi);
-
 
128
			$nom_saisi_sans_auteur = str_replace($auteur, '', $nom_saisi);
-
 
129
		}
-
 
130
 
-
 
131
		$nom_saisi_sans_auteur = trim($nom_saisi_sans_auteur);
-
 
132
		return $nom_saisi_sans_auteur;
-
 
133
	}
-
 
134
	
-
 
135
	private function estUneFormuleHybridite($nom_saisi) {
-
 
136
		return strpos($nom_saisi,' x ') !== false;
-
 
137
	}
-
 
138
	
-
 
139
	private function estUnHybride($nom_saisi) {
-
 
140
		return strpos($nom_saisi,'x ') === 0;
-
 
141
	}
-
 
142
	
84
		$resultat = @file_get_contents($url);
143
	private function parserResultatRechercheTaxon($resultat) {
85
		if($resultat != '') {
144
		$liste_genre_espece = array();
86
			$resultat = json_decode($resultat);
145
		$resultat = json_decode($resultat);
87
			if(is_object($resultat) && isset($resultat->resultat)) {
146
		if(is_object($resultat) && isset($resultat->resultat)) {
88
				foreach ($resultat->resultat as $id => $res) {
147
			foreach ($resultat->resultat as $id => $res) {
89
					$nom_complet = $res->{'nom_sci'}.' '.$res->auteur;
-
 
90
					$liste_genre_espece[] = array($id,$nom_complet);
148
				$nom_complet = $res->{'nom_sci'}.' '.$res->auteur;
91
				}
149
				$liste_genre_espece[] = array($id,$nom_complet);
92
			}
150
			}
93
		}		
151
		}
Line 94... Line 152...
94
		return $liste_genre_espece;
152
		return $liste_genre_espece;
95
	}
153
	}