Главная страница статей --> Хитрости при программировании php, заметки по базам данных

RSS-парсер на PHP

Источник: realcoding.net

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);
?>



Похожие статьи:
- 10 минут для SEO (search engine optimization)
- Защищаем контент сайта
- Генерация Flash на веб-сервере в PHP
- Проверка почтового адреса
- AJA - AJAX без XML
- SSI и общий стиль
- Отправка файлов аттачем
- Как через форму положить файл на сервер
- Поиграем с PHP - "Поле чудес"
- Модульное программирование на PHP или как написать маленький портал
- JavaScript Selections (работа с выделениями)
- Системы голосований на РНР
- На линии огня


Оглавление | Обсудить на форуме | Главная страница сайта | Карта сайта |

Контакты
Редакция:
[0.002]