Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: RSS парсер
 
 автор: antf   (02.11.2004 в 19:51)   письмо автору
 
 

Уважаемые администраторы и посетители форума. Представляю вам рабочий алгоритм 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("&"=>"&amp;""<"=>"&lt;"">"=>"&gt;""'"=>"&apos;"'"'=>"&quot;");
           foreach(
$SpecialChars as $Char => $CharCode)
              
$Str=str_replace($CharCode$Char$Str);
           Print(
$Str.'<hr>');
        }
    }
    
fclose($rss);
  } else
  {
     echo 
"К сожалению новостей сегодня не будет";
     exit;
  }
?>

   
 
 автор: cheops   (02.11.2004 в 23:32)   письмо автору
 
   для: antf   (02.11.2004 в 19:51)
 

Хм... попробовал - понравилось :) Только время новости лучше в русский формат перевести, т.е. английские названия месяцев на русские.

   
 
 автор: antf   (03.11.2004 в 01:35)   письмо автору
 
   для: 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("&"=>"&amp;""<"=>"&lt;"">"=>"&gt;""'"=>"&apos;"'"'=>"&quot;");
   
$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;
  }
?>

   
 
 автор: namo   (03.11.2004 в 02:18)   письмо автору
 
   для: antf   (03.11.2004 в 01:35)
 

А что такое RSS ?????

   
 
 автор: Кузнецов М.В.   (03.11.2004 в 03:01)   письмо автору
 
   для: namo   (03.11.2004 в 02:18)
 

Посмотрите по урлу

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=609&page=1

   
 
 автор: cheops   (03.11.2004 в 10:18)   письмо автору
 
   для: antf   (03.11.2004 в 01:35)
 

Хм... вот ещё что наверное стоит сделать - ссылки на первоисточник выводить не на страницу, а делать в виде гиперссылок и использовать слово подробнее.

   
 
 автор: XoLoD   (21.12.2004 в 02:01)   письмо автору
 
   для: cheops   (03.11.2004 в 10:18)
 

а прикольно!
а хотелосьбы ещё чтобы выводил не все новости а одну!
допустим в rss файле 15
 - <item>

нужно чтоб выводил только первую или третию!

   
 
 автор: sedek   (28.12.2004 в 22:56)
 
   для: XoLoD   (21.12.2004 в 02:01)
 

мне тоже интересно! подскажите плз

   
 
 автор: antf   (29.12.2004 в 05:30)   письмо автору
 
   для: sedek   (28.12.2004 в 22:56)
 

Появились новые версии.

   
 
 автор: antf   (29.12.2004 в 05:27)   письмо автору
 
   для: XoLoD   (21.12.2004 в 02:01)
 

Очень рад, что созданная мною тема, ушедшая давно куда-то далеко вниз, до сих пор вызывает интерес посетителей форума, поэтому я представляю две новые версии RSS парсера:
1)В данной версии полностью переработан код предыдущего варианта. Это было сделано, поскольку мои навыки и привычки программирования немного изменились. В последнее время я очень пристрастился к многомерным массивам, и думаю, что их применение сделало скрипт более гибким, изменяемым и элегантным (хотя это на любителя). Все предыдущие предложения, которые кардинально не меняли функциональность и структуру скрипта были учтены.

   
 
 автор: antf   (29.12.2004 в 05:34)   письмо автору
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);
Встречается повсеместно. Как сие чудесное выражение работает, и почему оно так часто возникает в скриптах, для меня до сих пор остается загадкой.

   
 
 автор: cheops   (29.12.2004 в 08:37)   письмо автору
 
   для: antf   (29.12.2004 в 05:34)
 

>До этого я думал, что случайные числа генерируются с помощью
>непонятной и громоздкой конструкции следующего вида:
>srand((double)microtime()*1000000);
>Встречается повсеместно. Как сие чудесное выражение
>работает, и почему оно так часто возникает в скриптах, для
>меня до сих пор остается загадкой.
Дело в том, что традиционно генератор случайных чисел инициировался времененной отметкой вручную (с C повелось), в противном случае генератор всегда генерировал одну и ту же последовательность случайную цифр. В PHP эту задачу выполняла функция srand, начиная с версии PHP 4.2 было принято решения делать это автоматчиески и теперь в инициализации генератора нет необходимости, хотя это не возбраняется и оставлено для обратной совместимости со старым кодом.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования