RSS/XML feed parser

Here's some php:

PHP
function xml_parser($page,$container,$tags,$number,$cdata) {
  if (!$number) {$number=100;}
  $stories=0;
  $xml=file_get_contents($page);
  preg_match_all("/<$container>.+<\/$container>/sU",$xml, $items);
  $items=$items[0];
  $itemsArray=array();
   foreach ($items as $item) {
    for($i=0; $i<count($tags); $i++) {
    preg_match("/<$tags[$i](.+)(<\/$tags[$i]>)/sU", $item, $tag);
    $this[$i]=preg_replace("/<$tags[$i]>(.+)(<\/$tags[$i]>)/sU",'$1',$tag);
    $this[$i]=array_map('html_entity_decode', $this[$i]);
    }
     if (count($itemsArray)<$number) {array_push($itemsArray, $this);}
   }
  $theData="<dl>";
  foreach ($itemsArray as $item) {
  for($i=0; $i<count($tags); $i++) {
  $data[$i]=$item[$i][0];    }
   $title=$data[0];
   $dpatterns[0]="/<img(.+)><\/img>/sU"; $dreplacements[0]='<img$1>';
   $dpatterns[1]="/<img(.+)\/>/sU"; $dreplacements[1]='<img$1>';
   $dpatterns[2]="/<(\/|)content?(.+|)>/sU"; $dreplacements[2]='';
   $dpatterns[3]="/border=\"0\"/sU"; $dreplacements[3]='';
   if ($cdata!='hide') {
    $dpatterns[4]="/<\!\[CDATA\[(.+)\]\]>/sU"; $dreplacements[4]='$1';
   }
   else {
    $dpatterns[4]="/<\!\[CDATA\[(.+)\]\]>/sU"; $dreplacements[4]='';
   }
   $description=preg_replace($dpatterns,$dreplacements,$data[1]);
   $link=preg_replace("/<link.+href=\"(.+)\"(.+|)\/>/sU",'$1',$data[2]);
   $date=$data[3];
   $theData.="
   <dt><a href=\"$link\">$title</a></dt>
   <dd class=\"story\">$description</dd>
   <dd>Date: $date</dd>\r";
  }
$theData.="</dl>";
return $theData;
}

$container='item';
$tags=array('title','description','link','pubDate');
$bbc=xml_parser("http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml",$container,$tags,10,'');
$cnn=xml_parser("http://rss.cnn.com/rss/cnn_topstories.rss",$container,$tags,10,'');

$container='entry';
$tags=array('title','content','link','published');
$flickr=xml_parser("http://api.flickr.com/services/feeds/photos_public.gne",$container,$tags,10,'');

Here's some HTML with PHP

HTML/PHP
<h2>bbc</h2>
<?php echo $bbc; ?>
<h2>cnn</h2>
<?php echo $cnn; ?>
<h2>flickr</h2>
<?php echo $flickr; ?>

Here's what we get... (the lastest feeds from the BBC, CNN, and flickr).

bbc

No 10 agrees to publish a plan for Brexit before triggering Article 50, ahead of a Labour debate.
Date: Tue, 06 Dec 2016 17:36:40 GMT
A Brexit deal will need to be reached by October 2018, EU negotiator Michel Barnier says.
Date: Tue, 06 Dec 2016 15:57:02 GMT
A man is convicted of giving £3,000 to the "man in the hat" suspected over Brussels terror attacks.
Date: Tue, 06 Dec 2016 14:19:00 GMT
Donald Trump says he wants to cancel the "out-of-control" order with Boeing for presidential planes.
Date: Tue, 06 Dec 2016 17:06:02 GMT
The EU referendum result does not permit ministers to trigger Brexit, the Supreme Court is told.
Date: Tue, 06 Dec 2016 17:04:25 GMT
British actor Peter Vaughan, best known for roles in Game of Thrones and Porridge, dies aged 93.
Date: Tue, 06 Dec 2016 15:22:22 GMT
The UK is still lagging behind at education, with little progress in international rankings.
Date: Tue, 06 Dec 2016 17:20:58 GMT
Beyonce and Adele receive multiple nominations for the 2017 Grammy Awards but David Bowie is snubbed in the best album category.
Date: Tue, 06 Dec 2016 14:56:04 GMT
The way England's railways are run is set for a major overhaul, the transport secretary says.
Date: Tue, 06 Dec 2016 10:51:25 GMT
The chancellor says the full-face veil should be prohibited across Germany where legally possible.
Date: Tue, 06 Dec 2016 15:59:36 GMT

cnn

Pete Veilleux said he was desperate and had no place to live. His friends Derick Almena and Micah Allison offered him a place to stay at the "Ghost Ship" warehouse, which Almena leased.
Date: Tue, 06 Dec 2016 16:58:01 GMT
German chancellor Angela Merkel has called for a ban on full veils in the country, during a speech at her party's conference on Tuesday. "The full veil is not appropriate here, it should be forbidden wherever that is legally possible. It does not belong to us," she said at the Christian Democratic Union gathering.
Date: Tue, 06 Dec 2016 16:50:04 GMT
A man on a hunting trip punches a kangaroo to save his dog. CNN's Jeanne Moos reports the kangaroo can't believe what hit him.
Date: Tue, 06 Dec 2016 01:29:19 GMT
Van Jones sits down for dinner with life-long Democrats who voted for Donald Trump.
Date: Tue, 06 Dec 2016 05:13:03 GMT
Some supporters of President-elect Donald Trump have praised his choice of Ben Carson to lead the Department of Housing and Urban Development, noting that the retired neurosurgeon had lived in public housing himself.
Date: Tue, 06 Dec 2016 17:11:28 GMT
Donald Trump wants to cancel a government order for a new Air Force One.
Date: Tue, 06 Dec 2016 17:33:48 GMT
Nominations for the 59th Annual Grammy Awards are scheduled to be announced Tuesday on "CBS This Morning."
Date: Tue, 06 Dec 2016 16:03:18 GMT
It was the year of the Olympics, the election ... and Pokemon Go.
Date: Tue, 06 Dec 2016 16:54:25 GMT
CNN's Alisyn Camerota sits down with the Donald Trump supporters who she continually checked in with throughout the election, asking them their opinions of the media.
Date: Tue, 06 Dec 2016 13:07:11 GMT
One of the biggest surprises of the election is how well Donald Trump did among women, especially white women.
Date: Tue, 06 Dec 2016 13:28:26 GMT

flickr

2016-12-06_06-49-05

dukanes posted a photo:

2016-12-06_06-49-05

Date: 2016-12-06T17:49:13Z
This year....

melmccarthy1 posted a photo:

This year....

Date: 2016-12-06T17:49:16Z
Winterzeit

fotissima♥ posted a photo:

Winterzeit

Date: 2016-12-06T17:49:17Z
slo-16

csabibacsi posted a photo:

slo-16

Date: 2016-12-06T17:49:11Z
Le passage et mouvements et force

photos.osmose posted a photo:

Le passage et mouvements et force

Date: 2016-12-06T17:49:11Z
2016-12-06 Derbyshire-7244.jpg

Elf Call posted a photo:

2016-12-06 Derbyshire-7244.jpg

Date: 2016-12-06T17:49:12Z
R2-03860-0012

srichgtr posted a photo:

R2-03860-0012

Date: 2016-12-06T17:49:15Z
Visita ao Bagergs

sindifisco_dspoa posted a photo:

Visita ao Bagergs

Date: 2016-12-06T17:49:15Z
Isla three

marlenedrew2003 posted a photo:

Isla three

Date: 2016-12-06T17:49:15Z
Untitled

trishamonster08 posted a photo:

Untitled

Visit this location at Trishas home in Second Life

Date: 2016-12-06T17:49:18Z

Comments

#1
2007-03-02 dumb_dave says :

Sorry, I'm new to this stuff, willing to learn and all that, but I don't get the idea. Copy that snippet of PHP code into a file and call it, say, parser.php. Copy the other snippet of HTML into a file and call it, for lack of inventiveness, parser.html. Right so far? If so, where's the intermediate step? How does this HTML "call" or "include" the PHP in order to function? Or am I missing something so basic that even asking this will earn me the cherished "Idiot of the Day Award"? Thanks.

#2
2007-03-02 BonRouge says :

dave,
You can include the php or just have it in one page. The page would have a '.php' extension - not '.html.'
Here's a simple example of this page (with no style or anthing) in one file.
Save it and change the extension to '.php'. If you don't have a server installed on your machine, you'll have to upload it to a remote server to view it.
If you want, you can take the php code out of that page and save it in a different file and include it into the page - that way, you could use it on more than one page if you wanted.

I hope that makes it a bit clearer.

#3
2007-03-02 dumb_dave says :

Thanks for the explanations. Much clearer now and ... yes, it indeed works like a champ. (Maybe I was just too tired? Putting 1 and 1 together and coming up with 11 instead of two?) Best regards and thanks for all the tips elsewhere as well.

#4
2007-03-07 dumb_dave says :

Useful indeed, BonRouge, but how does one display the <description> tagged material that is buried behind things like <![CDATA[ <p> etc.? Is the PHP code easily modified to handle that? And if so, can one apply it selectively? That is, show the fuller "description" material for one site but then reduce the next site entry to "headines" only (i.e., "titles" and "links") and then toggle the next one back to fuller details? Hope this is not a major headache, but it's beyond my ability to work it out at this stage ... and everything tried brought the larger process to a grinding halt. (This isn't a do-my-homework-for-me question. I'm bewildered by the code.) Thanks.

#5
2007-03-07 BonRouge says :

dave,
I thought I'd already sorted out the problem of data wrapped in the CDATA stuff. Does the code have a problem? If you could show me where it's not working, I'll try to improve it.
As for choosing whether to show that particular data or not, yes - I think you could do that by adding another variable. You see near the top where there's a preg_replace() to remove the CDATA tags? You could put that in an if statement - if the variable is not present, remove the CDATA tags, if it is, leave them where they are.
Does that make sense?

#6
2007-03-10 BonRouge says :

dave,
I think I found the problem and sorted it out. As you can see, it seems to work OK now. Some of the characters in the Lockergnome feed don't show right on this page though. I wonder if it's anything to do with me being in Japan. Do you see strange characters?

#7
2007-05-01 Ice says :

I have been trawling the web for days looking for something like this. Thanks a WHOLE lot man. I was also wondering if you can modify this parser to merge these fields and display, say, only the latest 10 items? wine

#8
2007-11-02 steve says :

thanks sorted out my cdata parasing problem, seems that is not too clear in the docs

s

Comment form

Please type the word 'PHP' here:

BB code available :

  • [b]...[/b] : bold
  • [it]...[/it] : italic
  • [q]...[/q] : quote
  • [c]...[/c] : code
  • [url=...]...[/url] : url