 | | Offres d'emplois |  | Développeur PHP+MySQL+CSS Dans le cadre du (re)développement de son site velovert.com, Riverside Publication (leader français de la Presse VTT, établi depuis 1989) cherche u... | |
 | | Avez vous lu ? |  | | |
|
 Une classe pour récupérer les flux RSS | |  |

<?php
class RSS {
// --- variables de cache
var $cache_actif = 0;
var $repertoire_cache = './cacheRSS/';
var $duree_cache = 3600;
// --- nombre maximum d'items à lire (0:pas de limite)
var $max_items = 0;
// --- suppression des tags html dans les infos
var $stripHTML = False;
// --- format de date
var $format_date = '';
// --- jeu de caractères à utiliser
var $charset = '';
// --- balises concernant le canal
var $tag_canal = array ('title', 'link', 'description',
'language', 'copyright', 'managingEditor', 'webMaster',
'lastBuildDate', 'rating', 'docs');
// --- balises concernant les items
var $tag_item = array('title', 'link', 'description',
'author', 'category', 'comments', 'enclosure', 'guid',
'pubDate', 'source');
// --- balises concernant les images
var $tag_image = array('title', 'url', 'link', 'width',
'height');
// --- balises concernant les zone de texte
var $tag_textinput = array('title', 'description', 'name',
'link');
// --- fonction de récupération des infos
function lecture_flux($url) {
// --- récupération du flux
$contenu = $this->recupere_flux($url);
// --- traitement
if ($contenu) {
$resultats = $this->traitement_flux($contenu);
}
}
// --- récupération des infos
// dans le cache ou sur le site
function recupere_flux($url) {
$contenu = '';
// --- lecture dans le cache
if ($this->cache_actif == 1) {
$fichier = $this->nom_cache($url);
$timedif = @(time() - filemtime($fichier));
if ($timedif < $this->duree_cache) {
$contenu = join('', file($fichier));
return($contenu);
}
}
// --- récupération sur le site
if ($f = @fopen($url, 'r')) {
while (!feof($f)) {
$contenu .= fgets($f, 4096);
}
fclose($f);
return($contenu);
// --- écriture dans le cache
if ($this->cache_actif == 1) {
$fichier = $this->nom_cache($url);
if ($f = @fopen($fichier, 'w')) {
fputs($f,$contenu);
fclose($f);
}
}
}
return FALSE;
}
// --- traitement du flux
// les infos sont stockées dans un tableau associatif
function traitement_flux($contenu) {
$result = array();
// --- encodage du document
$result['encoding'] = $this->extraction_infos(
"'encoding=[\'\"](.*?)[\'\"]'si",
$contenu);
// --- informations sur le canal
preg_match("'<channel.*?>(.*?)</channel>'si", $contenu, $tmp);
foreach($this->tag_canal as $tag) {
$txt = $this->extraction_infos(
"'<$tag.*?>(.*?)</$tag>'si", $tmp[1]);
if ($txt != '') $result[$tag] = $txt;
}
// --- informations de la zone textinput
// l'expression régulière permet de chercher les balises
// <textinput> avec ou sans attribut mais pas les balises
// <textinput />
preg_match("'<textinput(|[^>]*[^/])>(.*?)</textinput>'si",
$contenu, $tmp);
if (isset($tmp[2])) {
foreach($this->tag_textinput as $tag) {
$txt = $this->extraction_infos(
"'<$tag.*?>(.*?)</$tag>'si", $tmp[2]);
if ($txt != '') $result['textinput_'. $tag] = $txt;
}
}
// --- conversion du format de date de publication
if ($this->format_date != '' &&
($timestamp =
strtotime($result['lastBuildDate'])) !==-1) {
$result['lastBuildDate'] =
date($this->format_date, $timestamp);
}
// --- image du canal
preg_match("'<image.*?>(.*?)</image>'si",
$contenu, $tmp);
if (isset($tmp[1])) {
foreach($this->tag_image as $tag) {
$txt = $this->extraction_infos(
"'<$tag.*?>(.*?)</$tag>'si", $tmp[1]);
if ($txt != '') $result['image_'.$tag] = $txt;
}
}
// --- items
preg_match_all("'<item(| .*?)>(.*?)</item>'si",
$contenu, $items);
$rss_items = $items[2];
$result['nb_items'] = 0;
$result['items'] = array();
foreach($rss_items as $rss_item) {
// --- lecture des items
if ($result['nb_items'] < $this->max_items
|| $this->max_items == 0) {
foreach($this->tag_item as $itemtag) {
$tmp =
$this->extraction_infos("'(.*?)</$itemtag>'si", $rss_item);
if ($tmp != '') $result['items'][$i][$itemtag] = $tmp;
}
// --- conversion du format de date
if ($this->format_date != ''
&& ($timestamp =
strtotime($result['items'][$i]['pubDate'])) !==-1) {
$result['items'][$i]['pubDate'] =
date($this->format_date, $timestamp);
}
// --- compteur
$result['nb_items']++;
}
}
// --- fin du traitement
return($result);
}
// --- extraction des infos
function extraction_infos ($pattern, $texte) {
preg_match($pattern, $texte, $tb);
if(isset($tb[1])) {
// --- suppression éventuelle des tags HTML
if ($this->stripHTML) {
$tb[1] =
strip_tags($this->unhtmlentities(strip_tags($tb[1])));
}
// --- conversion éventuelle du jeu de caractères
if ($this->charset != '' && $this->rss_charset != '') {
$tb[1] = iconv($this->rss_charset, $this->charset
. '//TRANSLIT', $tb[1]);
}
return($tb[1]);
}
return ('');
}
// --- remplace les variables html (&xx;) par des caractères
function unhtmlentities ($string) {
// --- table des codes html
$trans_tbl =
get_html_translation_table (HTML_ENTITIES, ENT_QUOTES);
// --- inversion clés <--> valeurs
$trans_tbl =
array_flip ($trans_tbl);
// --- traitement des apostrophes
$trans_tbl +=
array(''' => "'");
// --- remplace le caractère codé par le caractère standard
return strtr ($string, $trans_tbl);
}
// --- nom donné au fichier de cache
function nom_cache($url) {
$fichier = $this->repertoire_cache . 'cache_' . md5($url);
return($fichier);
}
}
?>
|
|
|
 |
|