Cum sa procesam informatiile din RSS feed?

19 August, 2009 la 2:01 344 afisari

Etichete : , , , , ,

feed_processDaca 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. :D 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]

Cateva exemple de folosire.

Cam atat din acest articol,daca aveti intrebari(sau completari),sau intampinati probleme de implementare nu ezitati sa le prezentati.

Recomandam, pe aceeasi tema

PHP7 Comentarii
Tutoriale WEB – Concurs pentru programatori

Comentarii la "Cum sa procesam informatiile din RSS feed?"

  1. razvan says:

    sooper…:)

  2. razvan says:

    sooper…

  3. :D Sper sa iti fie folositor! :D

  4. Leocrux says:

    Se poate folosi rss feed pentru a vedea ultimul post de pe blog, sau sa te anunte cand se adauga un post?

  5. Daca te inscrii la feed bineinteles.Uita-te in colt dreapta sus,si dai subscribe. :D

  6. dage says:

    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 .

  7. 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. :D

Lasa un comentariu