|
|
|
| Уважаемые администраторы и посетители форума. Представляю вам рабочий алгоритм RSS парсера, написанный мною. Он небольшой, поэтому привожу его целиком. Данный скрипт выбирает данные из XML, записывает их в массив, а затем выводит их в браузер. Не могли бы вы посоветовать: как можно было бы его улучшить с точки зрения производительности, устойчивости, красоты решения?
<?php
$Url='http://news.yandex.ru/Yaroslavl/index.rss';
$rss=@fopen($Url, 'r');
if($rss) //Проверяем доступен ли rss файл
{
$Content=file($Url);
$Content=implode('\n', $Content);
$Content=strstr($Content, '<item>');
$Content=explode('\n', $Content);
print("<hr>");
foreach($Content as $Str)
{
//Определяем есть ли в строке требуемые тэги
if(ereg("<title>|<description>|<link>|<pubDate>", $Str)==True)
{
//Обрезаем начальный XML тэг
$Pos=StrPos($Str, ">");
$Str=SubStr($Str, $Pos+1);
//Обрезаем конечный XML тэг
$Pos=StrRPos($Str, "<");
$Str=SubStr_Replace($Str, '', $Pos);
//Преобразуем специальные символы
$SpecialChars=array("&"=>"&", "<"=>"<", ">"=>">", "'"=>"'", '"'=>""");
foreach($SpecialChars as $Char => $CharCode)
$Str=str_replace($CharCode, $Char, $Str);
Print($Str.'<hr>');
}
}
fclose($rss);
} else
{
echo "К сожалению новостей сегодня не будет";
exit;
}
?>
|
| |
|
|
|
|
|
|
|
для: antf
(02.11.2004 в 19:51)
| | Хм... попробовал - понравилось :) Только время новости лучше в русский формат перевести, т.е. английские названия месяцев на русские. | |
|
|
|
|
|
|
|
для: antf
(02.11.2004 в 19:51)
| | На данный момент в алгоритме произошло следующее изменение:
По совету Cheops'а добавлен фрагмент кода, преобразующий английские названия месяца и дня недели в русские.
<?php
$Url='http://news.yandex.ru/Yaroslavl/index.rss';
$Months=array('Jan'=>'января', 'Feb'=>'февраля', 'Mar'=>'марта', 'Apr'=>'апреля', 'May'=>'мая', 'Jun'=>'июня', 'Jul'=>'июля', 'Aug'=>'августа', 'Sep'=>'сентября','Oct'=>'октября','Nov'=>'ноября','Dec'=>'декабря');
$Days=array('Mon'=>'Понедельник', 'Tue'=>'Вторник', 'Wed'=>'Среда', 'Thu'=>'Четверг', 'Fri'=>'Пятница', 'Sat'=>'Суббота', 'Sun'=>'Воскресение');
$SpecialChars=array("&"=>"&", "<"=>"<", ">"=>">", "'"=>"'", '"'=>""");
$rss=@fopen($Url, 'r');
if($rss) //Проверяем доступен ли rss файл
{
$Content=file($Url);
$Content=implode('\n', $Content);
$Content=strstr($Content, '<item>');
$Content=explode('\n', $Content);
print("<hr>");
foreach($Content as $Str)
{
if(strpos($Str, "<pubDate>") == True)
$pubDateExists=True;
//Определяем есть ли в строке требуемые тэги
if(ereg("<title>|<description>|<link>|<pubDate>", $Str)==True)
{
//Обрезаем начальный XML тэг
$Pos=StrPos($Str, ">");
$Str=SubStr($Str, $Pos+1);
//Обрезаем конечный XML тэг
$Pos=StrRPos($Str, "<");
$Str=SubStr_Replace($Str, '', $Pos);
//Преобразуем название месяца и дня недели
if($pubDateExists==True)
{
foreach($Days as $EngName => $RusName)
$Str=str_replace($EngName, $RusName, $Str);
foreach($Months as $EngName => $RusName)
$Str=str_replace($EngName, $RusName, $Str);
} else
//Преобразуем специальные символы
foreach($SpecialChars as $Char => $CharCode)
$Str=str_replace($CharCode, $Char, $Str);
Print($Str.'<hr>');
}
$pubDateExists=False;
}
fclose($rss);
} else
{
echo "К сожалению новостей сегодня не будет";
exit;
}
?>
|
| |
|
|
|
|
|
|
|
для: antf
(03.11.2004 в 01:35)
| | А что такое RSS ????? | |
|
|
|
|
|
|
|
|
для: antf
(03.11.2004 в 01:35)
| | Хм... вот ещё что наверное стоит сделать - ссылки на первоисточник выводить не на страницу, а делать в виде гиперссылок и использовать слово подробнее. | |
|
|
|
|
|
|
|
для: cheops
(03.11.2004 в 10:18)
| | а прикольно!
а хотелосьбы ещё чтобы выводил не все новости а одну!
допустим в rss файле 15
нужно чтоб выводил только первую или третию! | |
|
|
|
|
автор: sedek (28.12.2004 в 22:56) |
|
|
для: XoLoD
(21.12.2004 в 02:01)
| | мне тоже интересно! подскажите плз | |
|
|
|
|
|
|
|
для: sedek
(28.12.2004 в 22:56)
| | Появились новые версии. | |
|
|
|
|
|
|
|
для: XoLoD
(21.12.2004 в 02:01)
| | Очень рад, что созданная мною тема, ушедшая давно куда-то далеко вниз, до сих пор вызывает интерес посетителей форума, поэтому я представляю две новые версии RSS парсера:
1)В данной версии полностью переработан код предыдущего варианта. Это было сделано, поскольку мои навыки и привычки программирования немного изменились. В последнее время я очень пристрастился к многомерным массивам, и думаю, что их применение сделало скрипт более гибким, изменяемым и элегантным (хотя это на любителя). Все предыдущие предложения, которые кардинально не меняли функциональность и структуру скрипта были учтены. | |
|
|
|
|
 926 байт |
|
|
для: antf
(29.12.2004 в 05:27)
| | 2)Эта версия учитывает пожелания некоторых посетителей и выводит только одну случайно выбранную новость. Написана при помощи функции rand(), о которой мне любезно поведал Cheops в теме:
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=691
До этого я думал, что случайные числа генерируются с помощью непонятной и громоздкой конструкции следующего вида: srand((double)microtime()*1000000);
Встречается повсеместно. Как сие чудесное выражение работает, и почему оно так часто возникает в скриптах, для меня до сих пор остается загадкой. | |
|
|
|
|
|
|
|
для: antf
(29.12.2004 в 05:34)
| | >До этого я думал, что случайные числа генерируются с помощью
>непонятной и громоздкой конструкции следующего вида:
>srand((double)microtime()*1000000);
>Встречается повсеместно. Как сие чудесное выражение
>работает, и почему оно так часто возникает в скриптах, для
>меня до сих пор остается загадкой.
Дело в том, что традиционно генератор случайных чисел инициировался времененной отметкой вручную (с C повелось), в противном случае генератор всегда генерировал одну и ту же последовательность случайную цифр. В PHP эту задачу выполняла функция srand, начиная с версии PHP 4.2 было принято решения делать это автоматчиески и теперь в инициализации генератора нет необходимости, хотя это не возбраняется и оставлено для обратной совместимости со старым кодом. | |
|
|
|