Viewing file: RSS.php (10.21 KB) -rw-rw-rw- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php // vim: set expandtab tabstop=4 shiftwidth=4 fdm=marker:
/** * XML RSS parser * * PHP version 4 * * @category XML * @package XML_RSS * @author Martin Jansen <mj@php.net> * @license PHP License http://php.net/license * @version SVN: $Id: RSS.php 310689 2011-05-01 17:54:48Z kguest $ * @link http://pear.php.net/package/XML_RSS */
require_once 'XML/Parser.php';
/** * RSS parser class. * * This class is a parser for Resource Description Framework (RDF) Site * Summary (RSS) documents. For more information on RSS see the * website of the RSS working group (http://www.purl.org/rss/). * * @category XML * @package XML_RSS * @author Martin Jansen <mj@php.net> * @license PHP License http://php.net/license * @link http://pear.php.net/package/XML_RSS */ class XML_RSS extends XML_Parser { // {{{ properties
/** * @var string */ var $insideTag = '';
/** * @var array */ var $insideTagStack = array();
/** * @var string */ var $activeTag = '';
/** * @var array */ var $channel = array();
/** * @var array */ var $items = array();
/** * @var array */ var $item = array();
/** * @var array */ var $image = array();
/** * @var array */ var $textinput = array();
/** * @var array */ var $textinputs = array();
/** * @var array */ var $attribs;
/** * @var array */ var $parentTags = array('CHANNEL', 'ITEM', 'IMAGE', 'TEXTINPUT');
/** * @var array */ var $channelTags = array( 'TITLE', 'LINK', 'DESCRIPTION', 'IMAGE', 'ITEMS', 'TEXTINPUT', 'LANGUAGE', 'COPYRIGHT', 'MANAGINGEditor', 'WEBMASTER', 'PUBDATE', 'LASTBUILDDATE', 'CATEGORY', 'GENERATOR', 'DOCS', 'CLOUD', 'TTL', 'RATING' );
/** * @var array */ var $itemTags = array( 'TITLE', 'LINK', 'DESCRIPTION', 'PUBDATE', 'AUTHOR', 'CATEGORY', 'COMMENTS', 'ENCLOSURE', 'GUID', 'SOURCE', 'CONTENT:ENCODED' );
/** * @var array */ var $imageTags = array('TITLE', 'URL', 'LINK', 'WIDTH', 'HEIGHT');
var $textinputTags = array('TITLE', 'DESCRIPTION', 'NAME', 'LINK');
/** * List of allowed module tags * * Currently supported: * * Dublin Core Metadata * blogChannel RSS module * CreativeCommons * Content * Syndication * Trackback * GeoCoding * Media * iTunes * * @var array */ var $moduleTags = array( 'DC:TITLE', 'DC:CREATOR', 'DC:SUBJECT', 'DC:DESCRIPTION', 'DC:PUBLISHER', 'DC:CONTRIBUTOR', 'DC:DATE', 'DC:TYPE', 'DC:FORMAT', 'DC:IDENTIFIER', 'DC:SOURCE', 'DC:LANGUAGE', 'DC:RELATION', 'DC:COVERAGE', 'DC:RIGHTS', 'BLOGCHANNEL:BLOGROLL', 'BLOGCHANNEL:MYSUBSCRIPTIONS', 'BLOGCHANNEL:BLINK', 'BLOGCHANNEL:CHANGES', 'CREATIVECOMMONS:LICENSE', 'CC:LICENSE', 'CONTENT:ENCODED', 'SY:UPDATEPERIOD', 'SY:UPDATEFREQUENCY', 'SY:UPDATEBASE', 'TRACKBACK:PING', 'GEO:LAT', 'GEO:LONG', 'MEDIA:GROUP', 'MEDIA:CONTENT', 'MEDIA:ADULT', 'MEDIA:RATING', 'MEDIA:TITLE', 'MEDIA:DESCRIPTION', 'MEDIA:KEYWORDS', 'MEDIA:THUMBNAIL', 'MEDIA:CATEGORY', 'MEDIA:HASH', 'MEDIA:PLAYER', 'MEDIA:CREDIT', 'MEDIA:COPYRIGHT', 'MEDIA:TEXT', 'MEDIA:RESTRICTION', 'ITUNES:AUTHOR', 'ITUNES:BLOCK', 'ITUNES:CATEGORY', 'ITUNES:DURATION', 'ITUNES:EXPLICIT', 'ITUNES:IMAGE', 'ITUNES:KEYWORDS', 'ITUNES:NEW-FEED-URL', 'ITUNES:OWNER', 'ITUNES:PUBDATE', 'ITUNES:SUBTITLE', 'ITUNES:SUMMARY' );
/** * @var array */ var $last = array();
// }}} // {{{ Constructor
/** * Constructor * * @param mixed $handle File pointer, name of the RSS file, or an RSS string. * @param string $srcenc Source charset encoding, use null (default) * to use default encoding (ISO-8859-1) * @param string $tgtenc Target charset encoding, use null (default) * to use default encoding (ISO-8859-1) * * @return void * @access public */ function XML_RSS($handle = '', $srcenc = null, $tgtenc = null) { if ($srcenc === null && $tgtenc === null) { $this->XML_Parser(); } else { $this->XML_Parser($srcenc, 'event', $tgtenc); }
$this->setInput($handle);
if ($handle == '') { $this->raiseError('No input passed.'); } }
// }}} // {{{ startHandler()
/** * Start element handler for XML parser * * @param object $parser XML parser object * @param string $element XML element * @param array $attribs Attributes of XML tag * * @return void * @access private */ function startHandler($parser, $element, $attribs) { if (substr($element, 0, 4) == "RSS:") { $element = substr($element, 4); }
switch ($element) { case 'CHANNEL': case 'ITEM': case 'IMAGE': case 'TEXTINPUT': $this->insideTag = $element; array_push($this->insideTagStack, $element); break; case 'ENCLOSURE' : $this->attribs = $attribs; break; default: $this->activeTag = $element; } }
// }}} // {{{ endHandler()
/** * End element handler for XML parser * * If the end of <item>, <channel>, <image> or <textinput> * is reached, this method updates the structure array * $this->struct[] and adds the field "type" to this array, * that defines the type of the current field. * * @param object $parser XML parser object * @param string $element Name of element that ends * * @return void * @access private */ function endHandler($parser, $element) { if (substr($element, 0, 4) == "RSS:") { $element = substr($element, 4); }
if ($element == $this->insideTag) { array_pop($this->insideTagStack); $this->insideTag = end($this->insideTagStack);
$this->struct[] = array_merge( array('type' => strtolower($element)), $this->last ); }
if ($element == 'ITEM') { $this->items[] = $this->item; $this->item = ''; }
if ($element == 'IMAGE') { $this->images[] = $this->image; $this->image = ''; }
if ($element == 'TEXTINPUT') { $this->textinputs = $this->textinput; $this->textinput = ''; }
if ($element == 'ENCLOSURE') { if (!isset($this->item['enclosures'])) { $this->item['enclosures'] = array(); }
$this->item['enclosures'][] = array_change_key_case( $this->attribs, CASE_LOWER ); $this->attribs = array(); }
$this->activeTag = ''; }
// }}} // {{{ cdataHandler()
/** * Handler for character data * * @param object $parser XML parser object * @param string $cdata CDATA * * @return void * @access private */ function cdataHandler($parser, $cdata) { if (in_array($this->insideTag, $this->parentTags)) { $tagName = strtolower($this->insideTag); $var = $this->{$tagName . 'Tags'};
if (in_array($this->activeTag, $var) || in_array($this->activeTag, $this->moduleTags) ) { $this->_add( $tagName, strtolower($this->activeTag), $cdata ); }
} }
// }}} // {{{ defaultHandler()
/** * Default handler for XML parser * * @param object $parser XML parser object * @param string $cdata CDATA * * @return void * @access private */ function defaultHandler($parser, $cdata) { return; }
// }}} // {{{ _add()
/** * Add element to internal result sets * * @param string $type Name of the result set * @param string $field Fieldname * @param string $value Value * * @return void * @access private * @see cdataHandler */ function _add($type, $field, $value) { if ($field == 'category') { $this->{$type}[$field][] = $value; } else if (empty($this->{$type}) || empty($this->{$type}[$field])) { $this->{$type}[$field] = $value; } else { $this->{$type}[$field] .= $value; }
$this->last = $this->{$type}; }
// }}} // {{{ getStructure()
/** * Get complete structure of RSS file * * @return array * @access public */ function getStructure() { return (array)$this->struct; }
// }}} // {{{ getchannelInfo()
/** * Get general information about current channel * * This method returns an array containing the information * that has been extracted from the <channel>-tag while parsing * the RSS file. * * @return array * @access public */ function getChannelInfo() { return (array)$this->channel; }
// }}} // {{{ getItems()
/** * Get items from RSS file * * This method returns an array containing the set of items * that are provided by the RSS file. * * @return array * @access public */ function getItems() { return (array)$this->items; }
// }}} // {{{ getImages()
/** * Get images from RSS file * * This method returns an array containing the set of images * that are provided by the RSS file. * * @return array * @access public */ function getImages() { return (array)$this->images; }
// }}} // {{{ getTextinputs()
/** * Get text input fields from RSS file * * @return array * @access public */ function getTextinputs() { return (array)$this->textinputs; }
// }}}
} ?>
|