Cum sa procesam informatiile din RSS feed?
feed, PHP, procesare feed, programare, rss, rss feed
Daca 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.





Nou pe 


Comentarii la "Cum sa procesam informatiile din RSS feed?"
sooper…:)
sooper…
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.