<?php /** * @file * OPML Parser. */ /** * Parse OPML file. * * @param $raw * File contents. * * @return array * An array of the parsed OPML file. */ function opml_parser_parse($raw) { $feeds = $items = array(); $xml = @ new SimpleXMLElement($raw); $feeds['title'] = (string)current($xml->xpath('//head/title')); // @todo Make xpath case insensitive. $outlines = $xml->xpath('//outline[@xmlUrl]'); foreach ($outlines as $outline) { $item = array(); foreach ($outline->attributes() as $k => $v) { if (in_array(strtolower($k), array('title', 'text', 'xmlurl'))) { $item[strtolower($k)] = (string) $v; } } // If no title, forge it from text. if (!isset($item['title']) && isset($item['text'])) { if (strlen($item['text']) < 40) { $item['title'] = $item['text']; } else { $item['title'] = trim(substr($item['text'], 0, 30)) . ' ...'; } } if (isset($item['title']) && isset($item['xmlurl'])) { $items[] = $item; } } $feeds['items'] = $items; return $feeds; }