| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
RSSReaderneon 11.06.05 19:17 PHP5:llä toteutettu scripti RSS-virran parsimiseen. Hyödyntää simpleXML:ää ja SPL::Iterator iteraattoria.
<?PHP class RSSReader implements Iterator { private $xmlObject; //simpleXML objekti private $resultSet; //tulostaulukko private $limit; //määrä private $iterator = 0; private $timestamps; private $meta; //tietoja uutisvirrasta const sortASC = SORT_ASC; const sortDESC = SORT_DESC; /* ottaa argumentikseen RSS virran osoitteen ja tarvittaessa halutun elementtien määrän */ public function __construct($url, $limit = 99999) { $this->limit = $limit; $this->timestamps = array(); $this->resultSet = array(); $this->meta = array(); $this->xmlObject = @simplexml_load_file($url); if($this->xmlObject == false) { throw new Exception("Unable to get/parse data from $url"); //XML dataa ei kyetty jäsentämään } $this->parseData(); } private static function parseTime($timeStr) { $month = array('Jan'=>1,'Feb'=>2,'Mar'=>3,'Apr'=>4,'May'=>5,'Jun'=>6,'Jul'=>7,'Aug'=>8,'Sep'=>9,'Oct'=>10,'Nov'=>11,'Dec'=>12); $temp = sscanf($timeStr,"%s %d %s %d %d:%d:%d"); $temp[2] = $month[$temp[2]]; return mktime($temp[4],$temp[5],$temp[6],$temp[2],$temp[1],$temp[3]); } private function parseData() { $current = 0; /* haetaan virran otsikko, kuvaus ja URL */ $this->meta[0] = utf8_decode($this->xmlObject->channel->title); $this->meta[1] = (string)$this->xmlObject->channel->link; $this->meta[2] = utf8_decode($this->xmlObject->channel->description); /* käydään virtaa läpi kunnes raja tulee vastaa tai kaikki elementit on käyty läpi */ foreach($this->xmlObject->channel->item as $feedItem) { $this->timestamps[] = $timestamp = self::parseTime($feedItem->pubDate); $url = (string)$feedItem->link; $title = utf8_decode((string)$feedItem->title); $this->resultSet[] = array($timestamp,$url,$title); if(++$current > $this->limit) break; } /* vapautetaan resursseja */ unset($this->xmlObject); } /* järjestää elementit kellonajan ja päivämäärän mukaan, joko nousevasti * (RSSReader::sortASC) tai laskevasti (RSSReader::sortDESC) */ public function sort($order = self::sortDESC) { array_multisort($this->timestamps,$order,$this->resultSet); } public function getLink() { return $this->meta[1]; } /* palauttaa RSS virran otsikon */ public function getTitle() { return $this->meta[0]; } /* palauttaa RSS virran kuvauksen */ public function getDescription() { return $this->meta[2]; } /* implementoidaan Iterator iteraattorissa määritelty metodin current() */ /* Palauttaa taulukon, joka sisältää data, johon iteraattori tällä hetkellä osoittaa */ public function current() { $res = array('timestamp' => $this->resultSet[$this->iterator][0], 'url' => $this->resultSet[$this->iterator][1], 'title' => $this->resultSet[$this->iterator][2]); return array_merge($res,$this->resultSet[$this->iterator]); } /* implementoidaan Iterator iteraattorissa määritelty metodin next() */ /* siirrytään seuraavaan elementtiin */ public function next() { $this->iterator++; } /* implementoidaan Iterator iteraattorissa määritelty metodin key() */ public function key() { return $this->iterator; } /* implementoidaan Iterator iteraattorissa määritelty metodin rewind() */ /* siirrytään ensimmäiseen elementtiin */ public function rewind() { $this->iterator = 0; } /* implementoidaan Iterator iteraattorissa määritelty metodin valid() */ /* tutkitaan onko uusia elementtejä vielä jäljellä */ public function valid() { return ((count($this->resultSet) > $this->iterator) ? true : false); } } /*ESIMERKKI:*/ $rss = new RSSReader("http://mureakuha.com/rss.php?stream=2"); $rss->sort(RSSReader::sortDESC); echo '<h2><a href="'.$rss->getLink().'">'.$rss->getTitle().'</a></h2>'; foreach($rss as $item) { printf('<li><a href="%s">%s</a>(%s)</li>',$item['url'],$item['title'],date("d.m.Y H:i",$item['timestamp'])); } |
![]() Haku
|