3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
13 if (!defined("_ECRIRE_INC_VERSION")) {
18 * Recuperer la liste des moteurs de recherche depuis un fichier txt
19 * Adaptees du code des "Visiteurs",
20 * par Jean-Paul Dezelus (http://www.phpinfo.net/applis/visiteurs/)
22 * https://code.spip.net/@stats_load_engines
26 function stats_load_engines() {
27 $arr_engines = array();
28 lire_fichier(find_in_path('engines-list.txt'), $moteurs);
29 foreach (array_filter(preg_split("/([\r\n]|#.*)+/", $moteurs)) as $ligne) {
30 $ligne = trim($ligne);
31 if (preg_match(',^\[([^][]*)\]$,S', $ligne, $regs)) {
35 if (preg_match(',=$,', $ligne, $regs)) {
38 $arr_engines[] = array($moteur, $query, $ligne);
47 * Retrouver les mots cles de recherche dans une url de referer
49 * Adaptees du code des "Visiteurs",
50 * par Jean-Paul Dezelus (http://www.phpinfo.net/applis/visiteurs/)
52 * https://code.spip.net/@stats_show_keywords
54 * @param string $kw_referer
57 function stats_show_keywords($kw_referer) {
58 static $arr_engines = '';
61 if (!is_array($arr_engines)) {
62 // Charger les moteurs de recherche
63 $arr_engines = stats_load_engines();
65 // initialiser la recherche interne
66 $url_site = $GLOBALS['meta']['adresse_site'];
67 $url_site = preg_replace(",^((https?|ftp):?/?/?)?(www\.)?,", "", strtolower($url_site));
70 if ($url = @parse_url
($kw_referer)) {
71 $query = isset($url['query']) ?
$url['query'] : "";
72 $host = strtolower($url['host']);
74 $scheme = $url['scheme'];
76 $scheme = $query = $host = $path = '';
79 // construire un array des variables directement depuis la query-string
80 parse_str($query, $Tquery);
85 if (!empty($url_site)) {
86 if (strpos('-' . $kw_referer, $url_site) !== false) {
87 if (preg_match(",(s|search|r|recherche)=([^&]+),i", $kw_referer, $regs)) {
88 $keywords = urldecode($regs[2]);
90 return array('host' => '');
93 for ($cnt = 0; $cnt < sizeof($arr_engines) && !$found; $cnt++
) {
94 if ($found = preg_match(',' . $arr_engines[$cnt][2] . ',', $host)
95 or $found = preg_match(',' . $arr_engines[$cnt][2] . ',', $path)
97 $kw_referer_host = $arr_engines[$cnt][0];
99 if (strpos($arr_engines[$cnt][1], '=') !== false) {
101 // Fonctionnement simple: la variable existe dans l'array
102 $v = str_replace('=', '', $arr_engines[$cnt][1]);
103 $keywords = isset($Tquery[$v]) ?
$Tquery[$v] : "";
105 // Si on a defini le nom de la variable en expression reguliere, chercher la bonne variable
106 if (!strlen($keywords) > 0) {
107 if (preg_match("," . $arr_engines[$cnt][1] . "([^\&]*),", $query, $vals)) {
108 $keywords = urldecode($vals[2]);
115 if (($kw_referer_host == "Google")
116 ||
($kw_referer_host == "AOL" && strpos($query, 'enc=iso') === false)
117 ||
($kw_referer_host == "MSN")
119 include_spip('inc/charsets');
120 if (!isset($ie) or !$cset = $ie) {
123 $keywords = importer_charset($keywords, $cset);
125 $buffer["hostname"] = $kw_referer_host;
131 $buffer["host"] = $host;
132 $buffer["scheme"] = $scheme;
133 if (!isset($buffer["hostname"]) or !$buffer["hostname"]) {
134 $buffer["hostname"] = $host;
137 $buffer["path"] = substr($path, 1, strlen($path));
138 $buffer["query"] = $query;
140 if ($keywords != '') {
141 if (strlen($keywords) > 150) {
142 $keywords = spip_substr($keywords, 0, 148);
143 // supprimer l'eventuelle entite finale mal coupee
144 $keywords = preg_replace('/&#?[a-z0-9]*$/', '', $keywords);
146 $buffer["keywords"] = trim(entites_html(urldecode(stripslashes($keywords))));
154 * Recherche des articles pointes par le referer
155 * https://code.spip.net/@referes
158 * @param string $serveur
161 function referes($referermd5, $serveur = '') {
162 $retarts = sql_allfetsel('J2.id_article, J2.titre',
163 'spip_referers_articles AS J1 LEFT JOIN spip_articles AS J2 ON J1.id_article = J2.id_article',
164 "(referer_md5='$referermd5' AND J1.maj>=DATE_SUB(" . sql_quote(date('Y-m-d H:i:s')) . ", INTERVAL 2 DAY))", '',
165 "titre", '', '', $serveur);
167 foreach ($retarts as $k => $rowart) {
168 $titre = typo($rowart['titre']);
169 $url = generer_url_entite($rowart['id_article'], 'article', '', '', true);
170 $retarts[$k] = "<a href='$url'><i>$titre</i></a>";
173 if (count($retarts) > 1) {
174 return '→ ' . join(',<br />→ ', $retarts);
176 if (count($retarts) == 1) {
177 return '→ ' . array_shift($retarts);