从rss(xml)源删除CDATA标记
问题描述:
我最好先说我不是程序员。我正在修改购物车,现在有一个问题超过了我的薪酬级别。购物车允许我在页面上的块中显示RSS源的输出。问题在于Feed的大部分内容都在CDATA标签内,因此无法正确显示。我需要从Feed中删除CDATA标签。从rss(xml)源删除CDATA标记
处理该饲料的代码是
function fn_get_rss_feed($data)
{
if (!empty($data['feed_url'])) {
$data_key = 'rss_data_cache_' . (isset($data['block_data']['block_id']) ? $data['block_data']['block_id'] : 0);
if (!empty($data['cache_time'])) {
Registry::register_cache($data_key, $data['cache_time'], CACHE_LEVEL_TIME);
}
if (Registry::is_exist($data_key) == false) {
$limit = !empty($data['max_item']) ? $data['max_item'] : 3;
$rss_data = array();
$rss = simplexml_load_string(fn_get_contents($data['feed_url']));
if (!empty($rss)) {
$it = 0;
$items = array();
foreach ($rss->channel->item as $item) {
if ($it > $limit) {
break;
}
$items[] = array(
'title' => (string)$item->title,
'description' => (string)$item->description,
'pubDate' => (string)$item->pubDate,
'link' => (string)$item->link
);
$it++;
}
$rss_data = array(array(
$items,
(string)$rss->channel->link,
$data['feed_url']
));
Registry::set($data_key, $rss_data);
}
return $rss_data;
} else {
return Registry::get($data_key);
}
}
return array();
}
它的“描述”这是有它周围CDATA标签。搜索网络,我发现这个代码从字符串中删除CDATA标签。
function strip_cdata($string)
{ preg_match_all('/<!\[cdata\[(.*?)\]\]>/is', $string, $matches);
return str_replace($matches[0], $matches[1], $string);
}
我认为有使用该功能,来自各地的说明剥去CDATA标签的方式 - 或者有没有。 rss feed的输出通过.tpl文件显示。
任何和所有帮助感激地收到。
布鲁斯
答
只是改变了线
$rss = simplexml_load_string(fn_get_contents($data['feed_url']));
到
$rss = simplexml_load_string(fn_get_contents($data['feed_url']), 'SimpleXMLElement', LIBXML_NOCDATA);
应该工作。第三个参数指示simplexml函数使用的底层库将CDATA的内容合并到文本节点中(请参阅http://php.net/manual/en/function.simplexml-load-string.php和http://www.php.net/manual/en/libxml.constants.php)。
感谢您的帮助,但它仍然显示cdata标签内的所有信息,而不是读取内容周围的html。 – user1328397 2012-04-12 09:00:12
恩,对不起,但我真的不明白这个问题。 – rwos 2012-04-12 09:33:46
不用担心 - 我相信你对我的工作还有更多的了解。 – user1328397 2012-04-12 10:21:10