Petit lecteur de rss sans prétention ...

Contenu du snippet

Salut à tous,
Je poste juste cette petite classe de lecture de flux RSS sans prétention. Elle est sans prétention dans le sens ou elle n'est pas très fiable (si par exemple le flux est mal écrit ou si l'URL du flux est fausse, et bah ... Je ne sais pas ce qui va se passer !). Mais par contre, son point fort est qu'elle est complémètement orientée objet et ainsi très simple à faire évoluer (par exemple, la faire évoluer pour qu'elle puisse aussi écrire et générer les flux ...).

Source / Exemple :


<?php
/* -------------------- */
   function utf2iso($string, $quotes = ENT_COMPAT, $slashesstriping = TRUE, $nl2brshape = TRUE)
   {
      if ($slashesstriping)
         $string = stripslashes($string);
      
      // Contrôle le charset réel (UTF-8 -> ISO-8859-15)
      $first = (!preg_match('`é`i', mb_convert_encoding($string.'é', 'UTF-8', 'ISO-8859-15'))) ? 'UTF-8, ISO-8859-15' : 'ISO-8859-15, UTF-8';
      
      // Teste s'il y a besoin d'une transformation (Optimisation)
      if (!mb_check_encoding($string,'ASCII'))
         $string = htmlentities(strip_tags($string), $quotes, mb_detect_encoding($string,$first) );

      // Convertit les \r\n
      return ($nl2brshape) ? nl2br($string) : strtr($string,chr(10).chr(13),'');
}
/* -------------------- */
   function getTextFromNode($node)
   {
      if($node -> nodeType == 3)
      {
         $text = $node -> wholeText;
      }
      else
      {
         $childs = $node -> childNodes;
         for($i = 0; $i < $childs -> length; $i++)
         {
            $child = $childs -> item($i);
            $text .= getTextFromNode($child);
         }
      }
      return $text;
   }
/* -------------------- */
   class RssReader
   {
      private $Path = '';
      private $Content = '';
      
      private $Channels = array();
      
      public function __construct($path)
      {
         
         $this -> Path = $path;
         $this -> loadRss();
         $this -> parse();
      }
      
      private function loadRss()
      {
         $path = $this -> Path;
         if(!@$handle = fopen($path, 'r'))
            throw new Exception("Le fichier $path n'existe pas ! ");
            
         $content = &$this -> Content;
         while (!feof($handle))
         {
            $content .= fgets($handle);
         }
         
         fclose($handle);
      }
      
      private function parse()
      {
         $content = $this -> Content;
         
         $xml = new DOMDocument();
         $xml -> loadXml($content);
         
         $this -> Content = '';
         
         $rss = $xml -> getElementsByTagName('rss') -> item(0);
         
         $xml_channels = $xml -> getElementsByTagName('channel');
         
         for($i = 0; $i < $xml_channels -> length; $i++)
         {
            $xml_channel = $xml_channels -> item($i);
            
            $title = utf2iso(getTextFromNode($xml_channel -> getElementsByTagName('title') -> item(0)));
            $link = utf2iso(getTextFromNode($xml_channel -> getElementsByTagName('link') -> item(0)));
            $description = utf2iso(getTextFromNode($xml_channel -> getElementsByTagName('description') -> item(0)));
            
            $channel = new RssChannel($title, $link, $description);
            
            $xml_items = $xml_channel -> getElementsByTagName('item');
            
            for($j = 0; $j < $xml_items -> length; $j++)
            {
               $xml_item = $xml_items -> item($j);
               
               $title = utf2iso(getTextFromNode($xml_item -> getElementsByTagName('title') -> item(0)));
               $link = utf2iso(getTextFromNode($xml_item -> getElementsByTagName('link') -> item(0)));
               
               //echo '<pre>'.$link.'</pre>';
               
               $description = utf2iso(getTextFromNode($xml_item -> getElementsByTagName('description') -> item(0)));
               
               $item = new RssItem($title, $link, $description);
               
               $channel -> addItem($item);
               
            }
            
            $this -> addChannel($channel);  
         }
      }
      
      public function addChannel($channel)
      {
         $channels = &$this -> Channels;
         array_push($channels, $channel);
      }
      
      public function getChannelByNumber($i)
      {
         return $this -> Channels[$i];
      }
      
      public function getNumberOfChannels()
      {
         return count($this -> Channels);
      }
   }
/* -------------------- */
   class RssChannel
   {
      private $Title = '';
      private $Link = '#';
      private $Description = '';
      
      private $Items = array();  
      
      public function __construct($title, $link, $description)
      {
         $this -> Title = $title;
         $this -> Link = ((substr($link, 0, 7) == 'http://') ? '' : 'http://').$link;
         $this -> Description = $description;
         
         /*echo '<pre>';
         echo strip_tags($description);
         echo '</pre>';*/
      } 
      
      public function getTitle()
      {
         return $this -> Title;
      }
      
      public function getLink()
      {
         return $this -> Link;
      }
      
      public function getDescription()
      {
         return $this -> Description;
      }
      
      public function addItem($item)
      {
         $items = &$this -> Items;
         array_push($items, $item);
      }
      
      public function getNumberOfItems()
      {
         return count($this -> Items);
      }
      
      public function getItemByNumber($i)
      {
         return $this -> Items[$i];
      }
   }

/* -------------------- */
   class RssItem
   {
      private $Title = '';
      private $Link = '';
      private $Description = '';
      
      public function __construct($title, $link, $description)
      {
         $this -> Title = $title;
         $this -> Link = ((substr($link, 0, 7) == 'http://') ? '' : 'http://').$link;
         $this -> Description = $description;
      }
      
      public function getTitle()
      {
         return $this -> Title;
      }
      
      public function getLink()
      {
         return $this -> Link;
      }
      
      public function getDescription()
      {
         return strip_tags($this -> Description);
      }
   }
/* -------------------- */
?>

Conclusion :


Voilà ... Je sais que ce n'est pas très commenté, mais franchement, ce n'est pas difficile à comprendre. Si vous avez des questions, remarques, etc., n'hésitez pas !
++ !
L.S.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.