I am looking for a off the shelf or custom made RSS parser which performs the same function as scripts like carp or magpie. These are great little scripts, but ideally I am wanting a solution which doesnt require you link out to the rss parser script development URL.
Shows yahoo news for a given keyword . <?php $keyword="seo"; $nr_news=6; echo '<p><b><font face="Arial" size="3" color="#3366CC">SEO News</font></b></p>'; $file = 'http://news.search.yahoo.com/news/rss?p='.urlencode($keyword).'&ei=UTF-8&n=10&fl=0&sday=6&eday=5'; $rss_channel = array(); $currently_writing = ""; $main = ""; $item_counter = 0; function startElement($parser, $name, $attrs) { global $rss_channel, $currently_writing, $main; switch($name) { case "RSS": case "RDF:RDF": case "ITEMS": $currently_writing = ""; break; case "CHANNEL": $main = "CHANNEL"; break; case "IMAGE": $main = "IMAGE"; $rss_channel["IMAGE"] = array(); break; case "ITEM": $main = "ITEMS"; break; default: $currently_writing = $name; break; } } function endElement($parser, $name) { global $rss_channel, $currently_writing, $item_counter; $currently_writing = ""; if ($name == "ITEM") { $item_counter++; } } function characterData($parser, $data) { global $rss_channel, $currently_writing, $main, $item_counter; if ($currently_writing != "") { switch($main) { case "ITEMS": if (isset($rss_channel[$main][$item_counter][$currently_writing])) { $rss_channel[$main][$item_counter][$currently_writing] .= $data; } else { //print ("rss_channel[$main][$item_counter][$currently_writing] = $data<br>"); $rss_channel[$main][$item_counter][$currently_writing] = $data; } break; } } } $xml_parser = xml_parser_create(); xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "characterData"); /* if (!($fp = fopen($file, "r"))) { die("could not open XML input"); } /* while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } */ $data=curl_string($file); xml_parse($xml_parser,$data); xml_parser_free($xml_parser); // putting in array $news=array(); if (isset($rss_channel["ITEMS"])) { if (count($rss_channel["ITEMS"]) > 0) for($i = 0;$i < count($rss_channel["ITEMS"]);$i++) $news[]=$rss_channel["ITEMS"][$i]; } $c=0; foreach($news as $key=>$val) { if($c<$nr_news) { echo "<p align=left>"; echo '<a href="'.$val['LINK'].'">'.$val['TITLE'].'</a> - '.$val['PUBDATE'].'<br>'.''.$val['DESCRIPTION'].'</font></p>'; } $c++; } function curl_string ($url,$user_agent='Mozilla 4.0'){ $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt ($ch, CURLOPT_HEADER, 0); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt ($ch, CURLOPT_TIMEOUT, 120); $result = curl_exec ($ch); curl_close($ch); return $result; } ?> Code (markup): Note : Uses CURL extension for PHP (recommended) if your server doesn't have CURL with a little change you can make it work
Thanks very much dude! I've been looking for a RSS solution like this for a while now. Please PM me your Godaddy details so I can send a domain name your way. Another thing, would you happen to know of a php rotation script which enables you to rotate from a selection of different RSS feeds? Cheers
Create a file rsslist.txt with one RSS url per line and after this use this , not sure if will work for all urls but you can try , also edited it here so not 100% that will work : <?php $nr_news=6; $rssurls=file("rsslist.txt"); $rand=rand(1,count($rssurls))-1; $file = $rssurls[$rand]; $rss_channel = array(); $currently_writing = ""; $main = ""; $item_counter = 0; function startElement($parser, $name, $attrs) { global $rss_channel, $currently_writing, $main; switch($name) { case "RSS": case "RDF:RDF": case "ITEMS": $currently_writing = ""; break; case "CHANNEL": $main = "CHANNEL"; break; case "IMAGE": $main = "IMAGE"; $rss_channel["IMAGE"] = array(); break; case "ITEM": $main = "ITEMS"; break; default: $currently_writing = $name; break; } } function endElement($parser, $name) { global $rss_channel, $currently_writing, $item_counter; $currently_writing = ""; if ($name == "ITEM") { $item_counter++; } } function characterData($parser, $data) { global $rss_channel, $currently_writing, $main, $item_counter; if ($currently_writing != "") { switch($main) { case "ITEMS": if (isset($rss_channel[$main][$item_counter][$currently_writing])) { $rss_channel[$main][$item_counter][$currently_writing] .= $data; } else { //print ("rss_channel[$main][$item_counter][$currently_writing] = $data<br>"); $rss_channel[$main][$item_counter][$currently_writing] = $data; } break; } } } $xml_parser = xml_parser_create(); xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "characterData"); /* if (!($fp = fopen($file, "r"))) { die("could not open XML input"); } /* while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } */ $data=curl_string($file); xml_parse($xml_parser,$data); xml_parser_free($xml_parser); // putting in array $news=array(); if (isset($rss_channel["ITEMS"])) { if (count($rss_channel["ITEMS"]) > 0) for($i = 0;$i < count($rss_channel["ITEMS"]);$i++) $news[]=$rss_channel["ITEMS"][$i]; } $c=0; foreach($news as $key=>$val) { if($c<$nr_news) { echo "<p align=left>"; echo '<a href="'.$val['LINK'].'">'.$val['TITLE'].'</a> - '.$val['PUBDATE'].'<br>'.''.$val['DESCRIPTION'].'</font></p>'; } $c++; } function curl_string ($url,$user_agent='Mozilla 4.0'){ $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt ($ch, CURLOPT_HEADER, 0); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt ($ch, CURLOPT_TIMEOUT, 120); $result = curl_exec ($ch); curl_close($ch); return $result; } ?> Code (markup):
Thanks man, so the txt file goes in the root directory of the server? And the rotation php code just before the rss parser php code on the web page?
Put php code in a file eg : rss.php and in your pages insert <? include "rss.php" ;?> , both files rss.php and rsslist.php must be in the same directory , or you can put full path to rsslist.txt file eg : /home/user/yoursite/rsslist.txt in rss.php . If you use .htm .html files read http://forums.digitalpoint.com/showthread.php?t=47144
This is better i think . NOT TESTED on server ! Put rss.php and rsslist.txt in root of your website . In files where you want RSS thing to appear put : <? include ($_SERVER["DOCUMENT_ROOT"]."/rss.php"); ?> Code (markup): rss.php <?php $nr_news=6; $rssfile=$_SERVER["DOCUMENT_ROOT"]."/rsslist.txt"; $rssurls=file($rssfile); $rand=rand(1,count($rssurls))-1; $file = $rssurls[$rand]; $rss_channel = array(); $currently_writing = ""; $main = ""; $item_counter = 0; function startElement($parser, $name, $attrs) { global $rss_channel, $currently_writing, $main; switch($name) { case "RSS": case "RDF:RDF": case "ITEMS": $currently_writing = ""; break; case "CHANNEL": $main = "CHANNEL"; break; case "IMAGE": $main = "IMAGE"; $rss_channel["IMAGE"] = array(); break; case "ITEM": $main = "ITEMS"; break; default: $currently_writing = $name; break; } } function endElement($parser, $name) { global $rss_channel, $currently_writing, $item_counter; $currently_writing = ""; if ($name == "ITEM") { $item_counter++; } } function characterData($parser, $data) { global $rss_channel, $currently_writing, $main, $item_counter; if ($currently_writing != "") { switch($main) { case "ITEMS": if (isset($rss_channel[$main][$item_counter][$currently_writing])) { $rss_channel[$main][$item_counter][$currently_writing] .= $data; } else { //print ("rss_channel[$main][$item_counter][$currently_writing] = $data<br>"); $rss_channel[$main][$item_counter][$currently_writing] = $data; } break; } } } $xml_parser = xml_parser_create(); xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "characterData"); /* if (!($fp = fopen($file, "r"))) { die("could not open XML input"); } /* while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } */ $data=curl_string($file); xml_parse($xml_parser,$data); xml_parser_free($xml_parser); // putting in array $news=array(); if (isset($rss_channel["ITEMS"])) { if (count($rss_channel["ITEMS"]) > 0) for($i = 0;$i < count($rss_channel["ITEMS"]);$i++) $news[]=$rss_channel["ITEMS"][$i]; } $c=0; foreach($news as $key=>$val) { if($c<$nr_news) { echo "<p align=left>"; echo '<a href="'.$val['LINK'].'">'.$val['TITLE'].'</a> - '.$val['PUBDATE'].'<br>'.''.$val['DESCRIPTION'].'</font></p>'; } $c++; } function curl_string ($url,$user_agent='Mozilla 4.0'){ $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt ($ch, CURLOPT_HEADER, 0); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt ($ch, CURLOPT_TIMEOUT, 120); $result = curl_exec ($ch); curl_close($ch); return $result; } ?> Code (markup):
Is that so? To tell you the truth I had only ever tried out Carp previously, I just assumed Magpie would have linked to their own site seeming as though it's so popular. It's all sorted out thanks to seopup so all is good
Cool that it's sorted, but for the benefit of others who may read this thread here's some info on using Magpie RSS
I have used BNC Advanced rss parser for a while .. it is a very simple script to use especially for non programmers
Check out RSSparser.com They have several open source and PHP RSS Parsing, XML and Json parsing snippets