Cum sa procesam informatiile din RSS feed?
7Daca aveti proiecte ce necesita procesarea unui feed RSS al unui site pentru a urmari stirile sau orice alte motive atunci va veti izbi cu siguranta de procesarea feed-ului.In acest articol voi prezenta doua functii : una pentru a extrage informatiile de baza ale feed-ului curent si o alta pentru a extrage itemii din aceasta. Ne vom folosi de cunostintele dobandite recent,si anume de aflarea response-ului unei pagini.
Observam ca aceasta functie este de baza in cazul in care dorim sa lucram cu surse externe si nu numai. 😀 Este de precizat ca am folosit ca exemple(teste) Feed-uri RSS 2.
Vom incepe cu getFeedInfo().Aceasta functie ne va returna informatii referitoare la titlul paginii curente,link-ul,descrierea etc.
function getFeedInfo($url) { //preluam raspunsul si il procesam $response = getResponsePage($url); $response = substr($response,0, strpos($response,"<item>")); //cautam informatiile de care avem nevoie preg_match("/<title>(.*?)<\/title>/",$response,$title); preg_match("/<link>(.*?)<\/link>/",$response,$link); preg_match("/<description>(.*?)<\/description>/",$response,$description); preg_match("/<lastBuildDate>(.*?)<\/lastBuildDate>/",$response,$lastBuildDate); preg_match("/<generator>(.*?)<\/generator>/",$response,$generator); preg_match("/<language>(.*?)<\/language>/",$response,$language); //procesam informatiile colectate si le validam if(sizeof($title) >= 2) $title = $title[1]; else $title = ""; if(sizeof($link) >= 2) $link = $link[1]; else $link = ""; if(sizeof($description) >= 2) $description = $description[1]; else $description = ""; if(sizeof($lastBuildDate) >= 2) $lastBuildDate = $lastBuildDate[1]; else $lastBuildDate = ""; if(sizeof($generator) >= 2) $generator = $generator[1]; else $generator = ""; if(sizeof($language) >= 2) $language = $language[1]; else $language = ""; //returnam informatiile return array("title" => $title, "link" => $link, "description" => $description, "lastBuild" => $lastBuildDate, "generator" => $generator, "language" => $language ); }
Functia are un singur argument, si anume calea catre feed si va returna un array.
Ca exemplu ne vom folosi de WorldIT Feed, apeland functia astfel :
$info = getFeedInfo(„http://www.worldit.info/feed/”);
- [title] => WorldIT
- [link] => http://www.worldit.info
- [description] => The world which goes bigger and bigger every day.
- [lastBuild] => Wed, 19 Aug 2009 09:13:50 +0000
- [generator] => http://wordpress.org/?v=2.8.4
- [language] => en
Pentru a folosi oricare din informatiile de mai sus ne vom folosi de array-ul returnat,spre exemplu codul de mai jos va afisa link-ul feed-ului :
echo $info[‘link’];
Atentie : Aceasta functie are toate atributele returnate valide pentru orice feed (main feed,article feed etc).
Trecem mai departe si vom incerca sa procesam item-urile(articole,comentarii etc) feed-ului curent.Functia getLastItems() ne va ajuta in aceasta situatie.
function getLastItems($url) { //extragem response-ul,pregatim item-urile pentru procesare $itemsFeed = array(array()); $response = getResponsePage($url); preg_match_all("/<item>(.*?)<\/item>/s",$response,$items); //procesam fiecare item in parte foreach($items[1] as $item) { $new = array(); //extragem informatiile preg_match("/<title>(.*?)<\/title>/",$item,$new['title']); preg_match("/<link>(.*?)<\/link>/",$item,$new['link']); preg_match("/<comments>(.*?)<\/comments>/",$item,$new['commentsURL']); preg_match("/<pubDate>(.*?)<\/pubDate>/",$item,$new['date']); preg_match("/<dc:creator>(.*?)<\/dc:creator>/",$item,$new['author']); preg_match("/<description>(.*?)<\/description>/s",$item,$new['description']); preg_match("/<content:encoded>(.*?)<\/content:encoded>/s",$item,$new['content']); preg_match("/<wfw:commentRss>(.*?)<\/wfw:commentRss>/",$item,$new['commentsRSS']); preg_match("/<slash:comments>(.*?)<\/slash:comments>/",$item,$new['commentsCount']); //procesam informatiile colecatate si le validam if(sizeof($new['title']) >= 2) $new['title'] = $new['title'][1]; else $new['title'] = ""; if(sizeof($new['link']) >= 2) $new['link'] = $new['link'][1]; else $new['link'] = ""; if(sizeof($new['commentsURL']) >= 2) $new['commentsURL'] = $new['commentsURL'][1]; else $new['commentsURL'] = ""; if(sizeof($new['date']) >= 2) $new['date'] = $new['date'][1]; else $new['date'] = ""; if(sizeof($new['author']) >= 2) $new['author'] = $new['author'][1]; else $new['author'] = ""; if(sizeof($new['description']) >= 2) $new['description'] = $new['description'][1]; else $new['description'] = ""; if(sizeof($new['content']) >= 2) $new['content'] = $new['content'][1]; else $new['content'] = ""; if(sizeof($new['commentsRSS']) >= 2) $new['commentsRSS'] = $new['commentsRSS'][1]; else $new['commentsRSS'] = ""; if(sizeof($new['commentsCount']) >= 2) $new['commentsCount'] = $new['commentsCount'][1]; else $new['commentsCount'] = ""; //procesam informatii ce au nevoie de o atentie speciala $new['description'] = str_replace(array("<![CDATA[","]]>"),"",$new['description']); $new['content'] = str_replace(array("<![CDATA[","]]>"),"",$new['content']); //adaugam informatiile la lista de cele procesate $itemsFeed[] = $new; } return $itemsFeed; }
Aceasta functie are deasemenea un singur argument, linkul catre feed.Functia returneaza un array de item-uri.Practic fiecare item(incepand indexarea de la 1) reprezinta un articol/comentariu al feed-ului respectiv.
Fiecare item,ca si in primul caz, este caracterizat deasemenea prin mai multe atribute :
- [title]
- [link]
- [commentsURL]
- [date]
- [author]
- [description]
- [content]
- [commentsRSS]
- [commentsCount]
Un exemplu de folosire a functiei ,afisand toate titlurile itemurilor feedului:
$items = getLastItems(„http://www.worldit.info/feed/”);
for($i = 1; $i < sizeof($items); $i++)
{
echo „Item „.$i.” : „.$items[$i][‘title’].”<br>”;
}
Atentie!!! Aceasta functie poate fi folosita si in cazul feed-urilor unui articol,insa in aceasta situatie unele atribute nu vor avea nici o valoare.Cele valide se afla in lista de mai jos :
- [title]
- [link]
- [date]
- [author]
- [description]
- [content]
Cam atat din acest articol,daca aveti intrebari(sau completari),sau intampinati probleme de implementare nu ezitati sa le prezentati.
sooper…:)
sooper…
😀 Sper sa iti fie folositor! 😀
Se poate folosi rss feed pentru a vedea ultimul post de pe blog, sau sa te anunte cand se adauga un post?
Daca te inscrii la feed bineinteles.Uita-te in colt dreapta sus,si dai subscribe. 😀
Nu am incercat functia de mai sus, dar am as vrea sa stiu daca merge pentru orice feed rss, pentru ca difera un rss 1.0 ; rss 2.0 ; feedburner .
Evident ca difera, am precizat faptul ca e special facut pentru RSS 2.0 , insa daca vei analiza sursa se pot face modificarile pentru taguri pentru a rezolva aceasta problema. 😀