Главная » Полезные статьи » Язык PHP » RSS-парсер на PHP
Распечатать статью

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 или его аналоги.

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

<?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); ?>
Источник: internet-technologies.ru
Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

Оставить комментарий

Похожие статьи