source: spip-zone/_core_/plugins/sites/inc/site.php @ 92993

Last change on this file since 92993 was 92993, checked in by cedric@…, 4 years ago

Report de r92992 : Robustesse de la detection du titre qui pouichait quand la balise title etait sur plusieurs lignes (contexte.com)

File size: 4.6 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2014                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
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\***************************************************************************/
12
13/**
14 * Fonctions utiles au plugin sites
15 *
16 * @package SPIP\Sites\Fonctions
17**/
18if (!defined("_ECRIRE_INC_VERSION")) return;
19
20
21/**
22 * Analyser une URL de site distant, qui peut être une syndication.
23 *
24 * @param string $url
25 *     URL du site à analyser
26 * @return array|bool
27 *     - array : informations du site
28 *     - false : site impossible à récupérer
29**/
30function analyser_site($url) {
31        include_spip('inc/filtres');
32        include_spip('inc/distant');
33
34        // Accepter les URLs au format feed:// ou qui ont oublie le http://
35        $url = preg_replace(',^feed://,i', 'http://', $url);
36        if (!preg_match(',^[a-z]+://,i', $url)) $url = 'http://'.$url;
37
38        $texte = recuperer_page($url, true);
39        if (!$texte) return false;
40
41        include_spip('inc/syndic');
42        cdata_echappe($texte, $echappe_cdata);
43
44        if (preg_match(',<(channel|feed)([\:[:space:]][^>]*)?'
45        .'>(.*)</\1>,ims', $texte, $regs)) {
46                $result['syndication'] = 'oui';
47                $result['url_syndic'] = $url;
48                $channel = $regs[3];
49
50                // Pour recuperer l'entete, on supprime tous les items
51                $b = array_merge(
52                        extraire_balises($channel, 'item'),
53                        extraire_balises($channel, 'entry')
54                );
55                $header = str_replace($b,array(),$channel);
56
57                if ($t = extraire_balise($header, 'title')) {
58                        cdata_echappe_retour($t, $echappe_cdata);
59                        $result['nom_site'] = filtrer_entites(supprimer_tags($t));
60                }
61                if ($t = extraire_balises($header, 'link')) {
62                        cdata_echappe_retour($t, $echappe_cdata);
63                        foreach ($t as $link) {
64                                $u = supprimer_tags(filtrer_entites($link));
65                                if (!strlen($u))
66                                        $u = extraire_attribut($link, 'href');
67                                if (strlen($u)) {
68                                        // on installe l'url comme url du site
69                                        // si c'est non vide, en donnant la priorite a rel=alternate
70                                        if (preg_match(',\balternate\b,', extraire_attribut($link, 'rel'))
71                                        OR !isset($result['url_site']))
72                                                $result['url_site'] = filtrer_entites($u);
73                                }
74                        }
75                }
76                $result['url_site'] = url_absolue($result['url_site'], $url);
77
78                if ($a = extraire_balise($header, 'description')
79                OR $a = extraire_balise($header, 'tagline')) {
80                        cdata_echappe_retour($a, $echappe_cdata);
81                        $result['descriptif'] = filtrer_entites(supprimer_tags($a));
82                }
83
84                if (preg_match(',<image.*<url.*>(.*)</url>.*</image>,Uims',
85                $header, $r)
86                AND preg_match(',(https?://.*/.*(gif|png|jpg)),ims', $r[1], $r)
87                AND $image = recuperer_infos_distantes($r[1])) {
88                        if (in_array($image['extension'], array('gif', 'jpg', 'png'))) {
89                                $result['format_logo'] = $image['extension'];
90                                $result['logo'] = $r[1];
91                        }
92                        else if ($image['fichier']) {
93                                spip_unlink($image['fichier']);
94                        }
95                }
96        }
97        else {
98                $result['syndication'] = 'non';
99                $result['url_site'] = $url;
100                if (preg_match(',<head>(.*(description|title).*)</head>,Uims', $texte, $regs)) {
101                        $head = filtrer_entites($regs[1]);
102                } else
103                        $head = $texte;
104
105                if (preg_match(',<title[^>]*>(.*),ims', $head, $regs)){
106                        $titre = trim($regs[1]);
107                        if (!strlen($titre)){
108                                $titre = substr($head,strpos($head,$regs[0]));
109                        }
110                        $result['nom_site'] = filtrer_entites(supprimer_tags(preg_replace(',</title>.*$,ims', '', $titre)));
111                }
112
113                if ($a = array_merge(
114                        extraire_balises($head, 'meta'),
115                        extraire_balises($head, 'http-equiv')
116                )) {
117                        foreach($a as $meta) {
118                                if (extraire_attribut($meta, 'name') == 'description') {
119                                        $desc = trim(extraire_attribut($meta, 'content'));
120                                        if (!strlen($desc))
121                                                $desc = trim(extraire_attribut($meta, 'value'));
122                                        $result['descriptif'] = $desc;
123                                }
124                        }
125                }
126
127                // Cherchons quand meme un backend
128                include_spip('inc/distant');
129                include_spip('inc/feedfinder');
130                $feeds = get_feed_from_url($url, $texte);
131                // si on a a trouve un (ou plusieurs) on le note avec select:
132                // ce qui constitue un signal pour exec=sites qui proposera de choisir
133                // si on syndique, et quelle url.
134                if (count($feeds)>=1) {
135                        spip_log("feedfinder.php :\n".join("\n", $feeds));
136                        $result['url_syndic'] = "select: ".join(' ',$feeds);
137                }
138        }
139
140        cdata_echappe_retour($result, $echappe_cdata);
141        return $result;
142}
143
144?>
Note: See TracBrowser for help on using the repository browser.