A quick-n-dirty RSS parser that does not require that XML support be compiled into PHP. It does require PHP v4 with PCRE support.
WebsiteBy : Matt
<?php
/*******************************************************************
* $Id: class.RSS.php3,v 0.91 2001/06/11 06:54:07 cdi Exp $
*
* class.RSS.php3
* Version: 0.91 (natch!)
* Author: Joseph Harris (CDI)
* Copyright (C) 2001, Joseph Harris
* cdi@thewebmasters.net
* http://www.thewebmasters.net/
*
*******************************************************************
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*******************************************************************
*
* I use a tab stop of (4) in my editor, so this file may look weird
* if you have your tab stop set differently.
*
* This class will completely parse RSS 0.91 compliant data.
* Reference the 'rss-0.91.dtd' included with this distribution
* or visit 'http://my.netscape.com/publish/formats/rss-0.91.dtd'
* or 'http://www.webreference.com/authoring/languages/xml/rss/1/'
*
* Requires: PHP4 w/PCRE support
*
* Basic usage is extremely simple:
*
* $rss = new RSS ($data);
*
* // The call to 'new' results in the data being parsed.
* // Data needs to be raw RSS data already obtained from a file or URL.
* // Data needs to be one big string, no pre-processing of the data is needed.
*
* $allItems = $rss->getAllItems();
* $itemCount = count($allItems);
* for($y=0;$y<$itemCount;$y++) {
* print "\nItem [$y] has data\n";
* print "[$y]: Title: " . $allItems[$y]['TITLE'];
* print "\n[$y]: Link : " . $allItems[$y]['LINK'];
* print "\n[$y]: Desc : " . $allItems[$y]['DESCRIPTION'];
* }
*
*/
class RSS
{
var $CHANNELS = array(); // Array, holds individual channel data
var $CHANNELINFO = array(); // Array that holds NON-ITEM channel data
var $COUNT = 0; // Number of channels found
function RSS ( $data = "", $simple = 0)
{
if($simple) {
// Ignore channel information, just grab <items>. Useful for
// RDF files, rss-0.9-simple and non-compliant RSS
$temp = array();
$temp[0][0] = $data;
$this->COUNT = 1;
$this->parseItems($temp);
} else {
$this->assignDATA($data);
}
}
/*
* void error ( string msg )
*/
function error ($msg="")
{
print "<H3>Error: [$msg]</H3>\n";
return;
}
/*
* int getCount ( void )
* returns the number of channels parsed or 0 if none found
*/
function getCount ()
{
return $this->COUNT;
}
/*
* array getChannel ( int channelID )
*/
function getChannel($channelID)
{
return $this->CHANNELS[$channelID];
}
/*
* array getChannelInfo ( int channelID )
*/
function getChannelInfo($channelID)
{
return $this->CHANNELINFO[$channelID];
}
/*
* int itemCount ( int channelID )
*/
function itemCount($channelID)
{
return count($this->CHANNELS[$channelID]['ITEMS']);
}
/*
* array getItems ( int channelID )
*/
function getItems($channelID)
{
return $this->CHANNELS[$channelID]['ITEMS'];
}
/*
* array getAllItems ( void )
*/
function getAllItems ()
{
$count = $this->getCount();
$ticker=0;
$allItems = array();
for ($x=0;$x<$count;$x++)
{
$itemCount = $this->itemCount($x);
$itemData = $this->getItems($x);
for($y=0;$y<$itemCount;$y++)
{
$allItems[$ticker]['TITLE'] = $itemData[$y]['TITLE'];
$allItems[$ticker]['LINK'] = $itemData[$y]['LINK'];
$allItems[$ticker]['DESCRIPTION'] = $itemData[$y]['DESCRIPTION'];
$ticker++;
}
}
return $allItems;
}
/*
* void assignData ( string data )
*/
function assignDATA ($data="")
{
if (empty($data)) {
$this->error("No RSS data submitted");
} else {
$this->parse($data);
}
return;
}
/*
* array parseChannels (string data )
*/
function parseChannels($data="")
{
$channelCount = preg_match_all("|<channel>(.*)</channel>|iUs",$data,$channels,PREG_SET_ORDER);
if(!$channelCount) {
$this->error("No channels in RSS data");
return;
} else {
$this->COUNT = $channelCount;
}
return $channels;
}
/*
* void storeItems ( string itemData, int channelID, int itemID )
*/
function storeItems($itemData="",$channelID,$itemID)
{
if(preg_match_all("|<title>(.+)</title>|iUs",$itemData,$match,PREG_SET_ORDER))
{
$title = $match[0][1];
$this->CHANNELS[$channelID]['ITEMS'][$itemID]['TITLE'] = "$title";
} else {
$this->CHANNELS[$channelID]['ITEMS'][$itemID]['TITLE'] = "";
}
if(preg_match_all("|<link>(.+)</link>|iUs",$itemData,$match,PREG_SET_ORDER))
{
$link = $match[0][1];
$this->CHANNELS[$channelID]['ITEMS'][$itemID]['LINK'] = "$link";
} else {
$this->CHANNELS[$channelID]['ITEMS'][$itemID]['LINK'] = "";
}
if(preg_match_all("|<description>(.+)</description>|iUs",$itemData,$match,PREG_SET_ORDER))
{
$desc = $match[0][1];
$this->CHANNELS[$channelID]['ITEMS'][$itemID]['DESCRIPTION'] = "$desc";
} else {
$this->CHANNELS[$channelID]['ITEMS'][$itemID]['DESCRIPTION'] = "";
}
return;
}
/*
* void storeChannelData ( string data, int channelID )
*/
function storeChannelData($data="",$channelID)
{
$data = str_replace("<channel>","",$data);
$data = str_replace("</channel>","",$data);
$lines = split("\n",$data);
while ( list ( $key, $line ) = each ($lines) )
{
$line = trim($line);
if(!empty($line))
{
if(preg_match("|<([^>]+)>(.*)</\\1>|U",$line,$matches))
{
$tagName = $matches[1];
$tagVal = $matches[2];
$this->CHANNELS[$channelID][$tagName] = $tagVal;
$this->CHANNELINFO[$channelID][$tagName] = $tagVal;
}
}
}
return;
}
/*
* void parseItems ( array channels )
*/
function parseItems($channels)
{
$channelCount = count($channels);
if(!$channelCount) {
$this->error("Could not locate any channel data to parse");
exit;
}
for($x=0;$x<$channelCount;$x++)
{
$channelData = $channels[$x][0];
$leftOvers = $channelData;
$itemCount = preg_match_all("|<item>(.*)</item>|iUs",$channelData,$items,PREG_SET_ORDER);
if($itemCount)
{
for($y=0;$y<$itemCount;$y++)
{
$itemData = $items[$y][0];
$leftOvers = str_replace("$itemData","",$leftOvers);
$this->storeItems($itemData,$x,$y);
}
}
$this->storeChannelData($leftOvers,$x);
}
return;
}
/*
* void parse ( string data )
*/
function parse($data="")
{
$channels = $this->parseChannels($data);
if(empty($channels)) { return; }
$this->parseItems($channels);
return;
}
/*
* Finito
*/
}
?>
| DISCLAIMER: The content provided in this article is not warranted or guaranteed by Developer Shed, Inc. The content provided is intended for entertainment and/or educational purposes in order to introduce to the reader key ideas, concepts, and/or product reviews. As such it is incumbent upon the reader to employ real-world tactics for security and implementation of best practices. We are not liable for any negative consequences that may result from implementing any information covered in our articles or tutorials. If this is a hardware review, it is not recommended to open and/or modify your hardware. |
More Content Management Code Articles
More By Codewalkers
developerWorks - FREE Tools! |
Visit IBM developerWorks to download IBM DB2 Express-C 9.5, a no-charge version of DB2 Express 9 database server. DB2 Express-C offers the same core data server base features as other DB2 Express editions and provides a solid base to build and deploy applications developed using C/C++, Java, .NET, PHP, and other programming languages. FREE! Go There Now!
|
|
|
|
Join this webcast to discover the key requirements for successful change and release management. Learn how to extend your .NET environment to improve productivity and collaboration, and address core problems afflicting team development. In this webcast, we’ll review typical challenges faced by customers and how to resolve them with the IBM Rational Change and Release Management solution, including Rational ClearCase, Rational ClearQuest and Rational Build Forge. Replay is available for 9 months. FREE! Go There Now!
|
|
|
|
Download a free trial version of IBM Rational Software Analyzer Developer Edition V7.0 to identify bug defects earlier in the software development cycle. Rational Software Analyzer is an extensible software development solution that reduces the expense of bug-fixes by enabling static analysis code reviews and bug identification very early in the development cycle. FREE! Go There Now!
|
|
|
|
As organizations integrate software into every aspect of business, they are constantly pressured to deliver faster, better, and cheaper results. Unfortunately, a “dis-integrated” software delivery approach reduces returns while increasing costs. This IBM Rational White Paper shows how Integrated Requirements Management aligns organizations around maximizing value and keeping pace with change. FREE! Go There Now!
|
|
|
|
Download the Rational Application Developer (RAD) v7.5 open beta code and start developing applications for the JEE5 standard which features EJB3.0, JPA, JSF 1.2, JSP 2.1 and Servlet 2.5 standards. When you use this beta you will see how you can increase developer productivity for already existing applications with improved support for refactoring, as well as adding new features to existing applications. In addition, the beta provides tooling for JD Edwards, Oracle, SAP, Siebel and PeopleSoft to improve the developer productivity with these enterprise systems. FREE! Go There Now!
|
|
|
|
Whether you are creating new applications or modifying existing ones, managing integration of new components with traditional z/OS elements is a critical part of building and deploying modern applications. Listen to this webcast to see how IBM can help you optimize your development process using an IDE like Rational Developer for System z that integrates with management tools, such as ClearCase to manage your application development on mainframes. FREE! Go There Now!
|
|
|
|
Visit IBM developerWorks to download a free trial of the latest release of IBM Lotus Sametime Standard V8.0. Lotus Sametime Standard V8.0 is a platform for unified communications and collaboration that combines security features with an extensible, open solution including integrated Voice over IP, geographic location awareness, mobile clients, and a robust Business Partner community offering telephony and video integration. FREE! Go There Now!
|
|
|
|
In this webcast, you'll get an introduction to the eXtreme Transaction Processing (XTP) features of WebSphere Extended Deployment and the common architectural traits required by XTP applications. See how WebSphere Extended Deployment's ObjectGrid feature provides a state-of-the-art infrastructure for hosting XTP applications. FREE! Go There Now!
|
|
|
|
Get a free trial download of the latest version of IBM Rational Tester for SOA Quality V7.0.1, a functional and regression testing tool that enables the creation, comprehension, modification and execution of testing GUI-less Web services. FREE! Go There Now!
|
|
|
|
As organizations have grown increasingly dependent on online software, the risk of malicious attacks has also become far more serious. Fortunately, well-governed organizations can protect their Web applications by injecting vulnerability assessments and ethical hacks into their software development and delivery processes. This paper describes 12 of the most common hacker attacks and provides basic rules that you can follow to help create more hack-resistant Web applications. FREE! Go There Now!
|
|
|
|
All FREE IBM® developerWorks Tools! |