За последние 24 часа нас посетили 17537 программистов и 1711 роботов. Сейчас ищет 1051 программист ...

Вывод RSS некорректный

Тема в разделе "PHP для новичков", создана пользователем eridan, 7 июл 2016.

  1. eridan

    eridan Новичок

    С нами с:
    28 май 2015
    Сообщения:
    11
    Симпатии:
    0
    Здравствуйте, хочу на свой сайт добавить RSS ленту, использую следующий код:
    PHP:
    1. include_once("write_rss.php");//подключаем файл с функцией вывода RSS-новостей
    2.   //адресс новостей (URL-адрес RSS потока)
    3.   $url_rss="https://aw.mail.ru/rss.xml";
    4.   //количество выводимых новостей
    5.   $kol_print_news=10;
    6.   //имя файла для хранения RSS-новостей на локальном сервере (то есть кэш-файл)
    7.   $file_rss="cache_rss.xml";
    8.   //время обновления, в часах
    9.   $hclock=1;
    10.   print_rss($url_rss,$file_rss,$hclock,$kol_print_news); //вызываем функцию вывода RSS-новостей
    Но лента RSS выводится некорректно с ненужными кавычками во круг блока новости, то есть название новости в начале и дата в конце выводится корректно, а все что между ними в кавычках (смотрел в консоле). Попытался в консоле отредактировать как HTML, что б посмотреть как будет и кавычки исчезают, не понимаю как они туда попали. Подскажите пожалуйста.

    [​IMG]

    write_rss.php:
    PHP:
    1. function print_rss($url_rss,$file_rss,$hclock,$kol_print_news)
    2.   {
    3.     //$url_rss - URL-адрес RSS потока
    4.     //$file_rss - адресс файла для хранения RSS-новостей
    5.     //$hclock - время обновления, в часах
    6.     //$kol_print_news - количество выводимых новостей
    7.      
    8.     if (!file_exists($file_rss) || ( filemtime($file_rss) + $hclock*60*60 < time() ) )//если файл не сохраняли, то сохраняем на локальном сервере или если существует, то проверяем устарел ли файл (не более Х часов назад он записан)
    9.       {
    10.        if (@!copy ($url_rss,$file_rss))
    11.          return (false);
    12.    
    13.        $text_rss=file($file_rss);
    14.        $text_rss=implode("",$text_rss);
    15.        //преобразуем кодировку данных
    16.        //если не нежно конвертировать кодировку, то комментируем ниже идущее условие или редактируем
    17.        if (preg_match('/<?xml[^>]+encoding[\s]*=[\s]*("|\')windows-1251("|\')[^>]+?>/i', $text_rss))
    18.          {
    19.        
    20.           $text_rss = iconv("cp1251", "utf-8", $text_rss);
    21.           file_put_contents($file_rss, $text_rss);//пишем данные обратно в файл
    22.        
    23.          }
    24.       }
    25.        
    26.     $text_rss=file($file_rss);
    27.     $text_rss=implode("",$text_rss);
    28.  
    29.     $url_image = "";
    30.     $image_is=preg_match("#<image>(.*?)</image>#is",$text_rss,$image_m);
    31.     if ( $image_is )
    32.       {
    33.    
    34.        $image_url_is = preg_match("#<url>(.*?)</url>#is",$image_m[0],$image_t);
    35.    
    36.        if ( $image_url_is )
    37.          $url_image = $image_t[1];
    38.       }
    39.  
    40.     $mas_item=array();
    41.     preg_match_all("#<item>.*?</item>#is",$text_rss,$mas_item);
    42.  
    43.     $one_item=array();
    44.     $t="";
    45.  
    46.     $t.=( $url_image ? "<div><img src='".$url_image."'  ></div>" :"");
    47.  
    48.     $kol=0;
    49.     if (sizeof($mas_item)>0)
    50.       {
    51.    
    52.        foreach ($mas_item[0] as $one_item)
    53.          {
    54.        
    55.           $date = "";
    56.           $kol++;
    57.           $t_is=preg_match("#<title>(.*?)</title>#is",$one_item,$title);
    58.           $l_is=preg_match("#<link>(.*?)</link>#is",$one_item,$link);
    59.           $d_is=preg_match("#<description>(.*?)</description>#is",$one_item,$description);
    60.        
    61.           $date_is=preg_match("#<pubDate>(.*?)</pubDate>#is",$one_item,$date_t);
    62.        
    63.           if ($t_is && $l_is)
    64.             {
    65.              $title[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#eis","'\\1'",$title[1]);
    66.              $link[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#eis","'\\1'",$link[1]);
    67.              $description[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#eis","'\\1'",$description[1]);
    68.          
    69.              if ( $date_is )
    70.                $date = strtotime($date_t[1]);
    71.          
    72.          
    73.              $t.="<div><a href='".$link[1]."' target='_blank'>".$title[1]."</a>
    74.              <br>"
    75.               .$description[1]
    76.               .( $date ? "<br>".date("d.n.Y",$date) : "" )
    77.               ."</div>";
    78.          
    79.             }
    80.           if ($kol >= $kol_print_news) break;
    81.          }
    82.       }
    83.     echo ($t);
    84.     return (true);
    85.   }
     
    #1 eridan, 7 июл 2016
    Последнее редактирование: 7 июл 2016
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    eridan нравится это.
  3. eridan

    eridan Новичок

    С нами с:
    28 май 2015
    Сообщения:
    11
    Симпатии:
    0
    То есть как я понял, ссылку на RSS нужно привести как то к коду и присвоить его к переменной?
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    RSS файл скачивай раз в час, чтобы его не скачивать каждый раз когда кто-то зайдёт на твой сайт. Можно сделать через CRON.
    Потом по примеру из документации ты можешь в цикле обойти файл и вывести его содержание как тебе нужно.
     
    eridan нравится это.
  5. eridan

    eridan Новичок

    С нами с:
    28 май 2015
    Сообщения:
    11
    Симпатии:
    0
    Спасибо, суть я понял, осталось выяснить как это осуществить. Хорошего дня!
     
  6. eridan

    eridan Новичок

    С нами с:
    28 май 2015
    Сообщения:
    11
    Симпатии:
    0
    Нашел такое решение, к сожалению мозгов не хватает пока самому написать подобное, есть ли в этом коде не добрые нюансы?

    PHP:
    1. $url = "https://aw.mail.ru/rss.xml";
    2. $ch = curl_init();
    3.  
    4. curl_setopt($ch, CURLOPT_URL, $url);
    5.  
    6. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    7.  
    8. $output = curl_exec($ch);
    9.  
    10.  
    11. $items = simplexml_load_string($output);
    12.  
    13. $items = $items->channel;
    14.  
    15. foreach ($items->item as $item) {
    16.     echo "<a href='$item->link'>".$item->title."</a><br>";
    17.     echo $item->description."<br>";
    18. }
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну решение, как решение. Только обращение к curl время занимает, посему denis01 тебе и сказал, записывать его в файл один раз в час. Да и при высокой посещаемости сайт-источник rss-а может твой сервер забанить, поскольку ты будешь им большую нагрузку создавать. А вряд ли у них rss чаще, чем раз в час обновляется.
     
    eridan нравится это.
  8. eridan

    eridan Новичок

    С нами с:
    28 май 2015
    Сообщения:
    11
    Симпатии:
    0
    Я понял, осталось выкопать как сделать запись в файл, спасибо всем!
     
  9. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    file_put_contents смотри
     
    eridan нравится это.
  10. eridan

    eridan Новичок

    С нами с:
    28 май 2015
    Сообщения:
    11
    Симпатии:
    0
    У моего хост провайдера есть услуга CRON но мне нужно ввести команду, написано что только для знающих Linux, время задания я выставил, а вот что за команда не понятно, файл, который должен запуститься раз в час - write_rss.php
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    варианты:
    1. php путь/write_rss.php
    2. /usr/bin/php write_rss.php
    3. wget -O - -q -t 1 http://твой-сайт.ru/write_rss.php
    Последний, ИМХО, на крайний случай, я его не люблю, поскольку php дёргается через веб-сервер, с ненужными ограничениями, которые обычно в cli-варианте отсутствуют. Но иногда первые два хостинги делать не позволяют первые два варианта

    Путь можно посмотреть, выведя __FILE__

    Если нет в панели автоматического прописывания времени, то читать https://ru.wikipedia.org/wiki/Cron
     
    eridan нравится это.
  12. eridan

    eridan Новичок

    С нами с:
    28 май 2015
    Сообщения:
    11
    Симпатии:
    0
    Все работает, спасибо большое, выбрал первый вариант..