RSS-парсер на PHP

RSS (Really Simple Syndication) был разработан фирмой Netscape и представляет собой расширение XML созданное специально для оформления новостных лент.
На сегодняшний день формат пережил уже 2-ю редакцию и является общепринятым стандартом для разметки новостей.

Вот пример простого RSS документа:

<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN"
"http://my.netscape.com/publish/formats/rss-0.91.dtd
<rss version="0.91">
<channel>
<title>none</title>
<description>заполнение пустоты</description>
<link>http://riscom.com/~none</link>
</channel>

<image>
<title>none</title>
<url>http://riscom.com/~none/favicon.gif</url>
<link>http://riscom.com/~none</link>
<width>16</width>
<height>16</height>
</image>

<item>
<title>RSS - вкусные новости </title>
<link>http://riscom.com/~none/</link>
<description>Что такое RSS и с чем его едят</description>
</item>

</rss>

Структура достаточно наглядна и понятна.

Два общих блока (channel и image), применяемых к целому документу и блок(и) item, содержащий сами новости.

Блок channel определяет источник новостей:

title - имя сайта;
description - описание;
link - адрес
Блок image - графическое отображение сайта:

title - название;
link - адрес картинки;
width, height - ширина и высота.
Блоков item может быть сколько угодно и в них описываются сами новости:

title - заголовок;
link - адрес самой новости;
description - описание.
Всё, что находится выше тэга rss называется заголовком документа и применяется к любому XML документу, конечно же с соответствующими корректировками.

Теперь, после того, как мы научились создавать RSS документ, давайте подумаем, что нам со всем этим добром делать.

Первая, и самая лёгкая идея, это, конечно же, ничего с ним не делать, просто создать процедурину автоматической генерации RSS из любой публикуемой новости и забыть о нём. Дескать, пускай те, кому это нужно, сами парсят его.
Но, предположим, что у нас есть некоторый ресурс, на котором мы хотим публиковать новости всем известного сайта www.IonPopescu.MD, а господин Popescu ни в какую не хочет предоставлять их (новости), в каком либо другом формате кроме как в RSS.
Что нам остаётся?
Правильно! Будем парсить.
Здесь, опять же, есть два выхода: первый - воспользоваться всеми известными парсерами xml типа Sablotron и не морочить себе голову, второй - морочить.
У второго варианта есть и ещё одно оправдание, представьте что вы пользуетесь каким-нибудь бесплатным хостингом, и хостер ну ни в какую не хочет устанавливать у себя Sablotron или его аналоги.

Источник: http://riscom.com/

 

----------------------------------------------------
И сам скрипт:

<?php

function startElement($parser, $name, $attrs) {
global $tag, $rss;
if ($name == 'RSS')
$rss = '^RSS';
elseif ($name == 'RDF:RDF')
$rss = '^RDF:RDF';

$tag .= '^' . $name;
}

function endElement($parser, $name) {
global $tag;
global $itemCount, $items;
if ($name == 'ITEM') {
$itemCount++;
if (!isset($items[$itemCount])) $items[$itemCount] = array('title' => '', 'link' => '', 'desc' => '', 'pubdate' => '');
}

$tag = substr($tag, 0, strrpos($tag, '^'));
}

function characterData($parser, $data) {
global $tag, $chanTitle, $chanLink, $chanDesc, $rss, $imgTitle, $imgLink, $imgUrl;
global $items, $itemCount;

$rssChannel = '';
if ($data) {
if ($tag == $rss . '^CHANNEL^TITLE') {
$chanTitle .= $data;
} elseif ($tag == $rss . '^CHANNEL^LINK') {
$chanLink .= $data;
} elseif ($tag == $rss . '^CHANNEL^DESCRIPTION') {
$chanDesc .= $data;
}
if ($rss == '^RSS') $rssChannel = '^CHANNEL';

if ($tag == $rss . $rssChannel . '^ITEM^TITLE') {
$items[$itemCount]['title'] .= $data;
} elseif ($tag == $rss . $rssChannel . '^ITEM^LINK') {
$items[$itemCount]['link'] .= $data;
} elseif ($tag == $rss . $rssChannel . '^ITEM^DESCRIPTION') {
$items[$itemCount]['desc'] .= $data;
} elseif ($tag == $rss . $rssChannel . '^ITEM^PUBDATE') {
$items[$itemCount]['pubdate'] .= $data;
} elseif ($tag == $rss . $rssChannel . '^IMAGE^TITLE') {
$imgTitle .= $data;
} elseif ($tag == $rss . $rssChannel . '^IMAGE^LINK') {
$imgLink .= $data;
} elseif ($tag == $rss . $rssChannel . '^IMAGE^URL') {
$imgUrl .= $data;
}
}

}

function parseRSS($url) {
global $tag, $chanTitle, $chanLink, $chanDesc, $rss, $items, $itemCount, $imgTitle, $imgLink, $imgUrl;
$chanTitle = '';
$chanLink = '';
$chanDesc = '';
$imgTitle = '';
$imgLink = '';
$imgUrl = '';
$tag = '';
$rss = '';

global $items, $itemCount;

$itemCount = 0;
$items = array(0 => array('title' => '', 'link' => '', 'desc' => '', 'pubdate' => ''));

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");

@$fp = fopen($url, "r");
$data = "";
while (true) {
@$datas = fread($fp, 4096);
if (strlen($datas) == 0) {
break;
}
$data .= $datas;
}

@fclose($fp);

if ($data != '') {
$xmlresult = xml_parse($xml_parser, $data);
$xmlerror = xml_error_string(xml_get_error_code($xml_parser));
$xmlcrtline = xml_get_current_line_number($xml_parser);

if ($xmlresult)
displayData();
else
print("Error parsing this feed !<br />Error: $xmlError , at line: $xmlCrtline");
} else {
print("Error while retriving feed $url");
}

xml_parser_free($xml_parser);
}

function displayData() {
global $chanTitle, $chanLink, $chanDesc, $rss, $items, $itemCount, $imgTitle, $imgLink, $imgUrl;
global $items, $itemCount;
?>
<html><head><title><?= $chanTitle ?></title></head>
<body>
<div>
<a href="<?= $chanLink ?>"><img src="<?= $imgUrl ?>" alt="<?= $imgTitle ?>" border="0" /></a>
<h1><?= $chanTitle ?></h1>
<h3><?= $chanDesc ?></h3>
</div>
<hr />
<?php
for($i = 0;$i < count($items)-1;$i++) {
echo "<h4>".$items[$i]['title']."</h4>";
echo "<h5>".$items[$i]['pubdate']."</h5>";
echo "<a href='".$items[$i]['link']."'>".$items[$i]['desc']."</a>";
}
?>
</body></html>

<?php }

$url="http://xmlhack.ru/index.rdf";
parseRSS($url);
?>

Автор: shade33
Источник:XML-форумы на Raleigh.ru http://www.raleigh.ru/



Опубликовал admin
10 Мар, Пятница 2006г.



Программирование для чайников.