Блог Ромки » Пишем RSS Reader
Дек
26

Пишем RSS Reader


0dc09226

Категория: Программируем

      В данной статье будет описано написание RSS читалки с применение регулярных выражений. За основу возьмём RSS канал этого блога в FeedBurner'е. Будем читать заголовок, ссылку и текст поста и выводить на экран уже ввиде html кода.
Перед прочтением подпишитесь на RSS, особенно если не знаете что такое регулярные выражения (:
Открываем xml-код потока и видим:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">
 
<channel>
	<title>Блог Ромки</title>
 
	<link>http://atoll-bio.ru</link>
	<description />
	<lastBuildDate>Fri, 25 Dec 2021 12:54:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/romka" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">romka</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Парсер своими руками. Теория</title>
		<link>http://atoll-bio.ru/2009/12/parser-svoimi-rukami-teoriya.html</link>
		<comments>http://atoll-bio.ru/2009/12/parser-svoimi-rukami-teoriya.html#comments</comments>
		<pubDate>Fri, 25 Dec 2021 12:18:08 +0000</pubDate>
		<dc:creator>Ромка</dc:creator>
				<category><![CDATA[Программируем]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[парсер]]></category>
		<category><![CDATA[программирование]]></category>
 
		<guid isPermaLink="false">http://atoll-bio.ru/?p=54</guid>
		<description>      Собственно, что такое парсер? Это скрипт/программа/куча текста, которая запрашивает страницу на другом сайте и берёт с него то, что нужно вебмастеру.
      Я ничего не читал по написанию парсеров и грабберов, додумался до этого способа сам, так что не критикуйте, если есть более лёгкий способ.
      Принцип моего способа довольно прост.
      Сначала получаем контент с нужного [...]&lt;img src="http://feeds.feedburner.com/~r/romka/~4/-MP8YyQoYWQ" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://atoll-bio.ru/2009/12/parser-svoimi-rukami-teoriya.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Апдейт тИЦ 24.12.09</title>
		<link>http://atoll-bio.ru/2009/12/apdejt-tic-24-12-09.html</link>
		<comments>http://atoll-bio.ru/2009/12/apdejt-tic-24-12-09.html#comments</comments>
		<pubDate>Thu, 24 Dec 2021 08:56:54 +0000</pubDate>
		<dc:creator>Ромка</dc:creator>
				<category><![CDATA[Поисковые системы]]></category>
		<category><![CDATA[Апдейт]]></category>
		<category><![CDATA[тИЦ]]></category>
		<category><![CDATA[Яндекс]]></category>
 
		<guid isPermaLink="false">http://atoll-bio.ru/?p=51</guid>
		<description>     Сабж, сегодня апдейт тицки у яндекса. Сам давно закинул это дело (хотя для блога надо постараться), но не написать про ап не могу (:
     Собственно, у кого какие успехи?&lt;img src="http://feeds.feedburner.com/~r/romka/~4/f_13tN1bxxs" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://atoll-bio.ru/2009/12/apdejt-tic-24-12-09.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>А чевой-то вы там хотите?</title>
		<link>http://atoll-bio.ru/2009/12/a-chevoj-to-vy-tam-xotite.html</link>
		<comments>http://atoll-bio.ru/2009/12/a-chevoj-to-vy-tam-xotite.html#comments</comments>
		<pubDate>Wed, 23 Dec 2021 18:34:55 +0000</pubDate>
		<dc:creator>Ромка</dc:creator>
				<category><![CDATA[Новости блога]]></category>
		<category><![CDATA[блог]]></category>
 
		<guid isPermaLink="false">http://atoll-bio.ru/?p=45</guid>
		<description>Сегодня на блоге появилась новая страница желаний... Она предназначена для увеличения актуальности моих статей. Ведь не всегда угадаешь, чего хотят читатели, но теперь вы сами можете потребовать подсказать, что вы хотите. Не оставляйте без внимания эту ветку блога, возможно, благодаря ней вы станете моим постоянным читателем? (:&lt;img src="http://feeds.feedburner.com/~r/romka/~4/6gorvJnY-jw" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://atoll-bio.ru/2009/12/a-chevoj-to-vy-tam-xotite.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Загрузка файлов в стиле AJAX</title>
		<link>http://atoll-bio.ru/2009/12/zagruzka-fajlov-v-stile-ajax.html</link>
		<comments>http://atoll-bio.ru/2009/12/zagruzka-fajlov-v-stile-ajax.html#comments</comments>
		<pubDate>Tue, 22 Dec 2021 13:07:48 +0000</pubDate>
		<dc:creator>Ромка</dc:creator>
				<category><![CDATA[Программируем]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[загрузка файлов]]></category>
		<category><![CDATA[программирование]]></category>
 
		<guid isPermaLink="false">http://atoll-bio.ru/?p=18</guid>
		<description>      Собственно, первая статья на тему сайтостроения, не судите строго (:
      Значит в данный момент технология AJAX стала довольно популярной, а ведь действительно, очень удобно отправлять и получать данные без обновления страницы, экономит траффик, да и вообще это стильно. Аналогично есть и jquery, с этой системой вообще не знаком, но вроде принцип такой же - [...]&lt;img src="http://feeds.feedburner.com/~r/romka/~4/iKdwatV9L_4" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://atoll-bio.ru/2009/12/zagruzka-fajlov-v-stile-ajax.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Первый день блога</title>
		<link>http://atoll-bio.ru/2009/12/pervyj-den-bloga.html</link>
		<comments>http://atoll-bio.ru/2009/12/pervyj-den-bloga.html#comments</comments>
		<pubDate>Sun, 20 Dec 2021 15:22:39 +0000</pubDate>
		<dc:creator>Ромка</dc:creator>
				<category><![CDATA[Новости блога]]></category>
		<category><![CDATA[Я]]></category>
		<category><![CDATA[блог]]></category>
		<category><![CDATA[первый день]]></category>
 
		<guid isPermaLink="false">http://atoll-bio.ru/?p=4</guid>
		<description>Такс...
Во-первых, здрас... Да вытирайте же ноги, ёж твою в корень гости дорогие!
Во-вторых, это мой уже второй блог и я надеюсь... Да куда ты тварь лохматую собаку тянешь к монитору? И так пёрднуть дыхнуть негде...
В-третьих, почему я заново создал новый блог? Да потому что мои друзья задолбали капать на мозги подсказали сделать его, мол мне есть о [...]&lt;img src="http://feeds.feedburner.com/~r/romka/~4/xbuebJ-zQdI" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://atoll-bio.ru/2009/12/pervyj-den-bloga.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

      Это и есть код RSS потока. Не буду вдаваться в подробности, объясню только что на нужно. Каждый пост оформляется и отделяется от остальных таким образом:

1
<item> содержание поста </item>

      В посте нам надо выделить заголовок (тэг title), ссылку (тэг link) и краткое описание (тэг description). Т.е. нам надо выделить блоки такого строения:

1
<item> ... <title>TITLE</title> ... <link>http://LINK</link> ... <description>DESCRIPTION</description> ... </item>

      Это один элемент rss ленты.
      Регулярное выражение, которое будет замечать и вытаскивать нужные элементы:

1
$n = preg_match_all('!<item>.*<title>(.*)</title>.*<link>(.*)</link>.*<description>(.*)&lt;img\ssrc.*</description>!Uis',$xml,$result);

      ! - левый ограничитель.
      .* - любой текст/код.
      ( ) - в скобки берётся участок кода, который нужно вытащить.
      (.*) - смотря выше понимаем, что это любой текст, который надо запомнить. Для нам это тексты внутри тэгов title, link, description.
      &lt;img\ssrc - здесь &lt;img это код, который присутствует в выдаче feedburner'а, далее идёт пробел, он обозначается как \s и src - это тоже код в странице.
      !Uis - правый ограничитель и модификаторы. Модификатор U делает регулярное выражение "жадным", т.е. заставляет искать минимальное соответствие регулярному выражению, s - заставляет точку смотреть на \n как на обычный символ, i - это нечувствительность к регистру а-ля вам по барабану маленькие там буквы или большие (:
      $xml - код выдачи, т.е. входящие данные.
      $result - результирующий файл. Идёт как массив.
      Переменной $n присваивается количество циклов замены, которые произвела функция. В нашем случае оно означает сколько функция нашла участков код вида <item> ... </item>, а это количество постов.
      Теперь разберём результирующий массив $result.
      Так как за цикл у нас запоминается три элемента (заголовок, ссылка и описание), то первый индекс определяет что выводить:
      $result[1] - Заголовок
      $result[2] - Ссылка
      $result[3] - Описание
     А из-за того, что элементов у нас несколько, то массив у нас имеет ещё один индекс - номер почта. Он начинается с нуля. Итого у нас массив вида:
$result[что_выводить][номер_поста_начиная_с_нуля]
     Например:
     $result[1,1] - Заголовок второго элемента
     $result[3,4] - Описание пятого элемента
     Собственно и всё. Полный код RRS Reader'а:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$url="http://feeds.feedburner.com/romka?format=xml";
$xml = iconv('utf-8','windows-1251',file_get_contents($url));
$n = preg_match_all('!<item>.*<title>(.*)</title>.*<link>(.*)</link>.*<description>(.*)&lt;img\ssrc.*</description>!Uis',$xml,$result);
if($n)
    {
    for($a=0;$a<$n;$a++)
        {
        echo "<a href='".$result[2][$a]."'>".$result[1][$a]."</a><br />".$result[3][$a]."<br />----------<br />";
        };
    };
?>

Пример скрипта - Подпишись на RSS


3 коммент. к “Пишем RSS Reader”

  1. solarisadmin | Янв 16, 2022

    А почему, собственно, регулярные выражения, а не встроенные xml-парсеры?

  2. ALex | Фев 11, 2022

    думаю для того чтоб я узнал что означает Uis
    (долго искал)

  3. realn00b | Фев 18, 2022

    наверно потому что это можно сказать основы, мне б покрайней мере было бы удобнее :)