Здравствуйте, хочу на свой сайт добавить RSS ленту, использую следующий код: PHP: include_once("write_rss.php");//подключаем файл с функцией вывода RSS-новостей //адресс новостей (URL-адрес RSS потока) $url_rss="https://aw.mail.ru/rss.xml"; //количество выводимых новостей $kol_print_news=10; //имя файла для хранения RSS-новостей на локальном сервере (то есть кэш-файл) $file_rss="cache_rss.xml"; //время обновления, в часах $hclock=1; print_rss($url_rss,$file_rss,$hclock,$kol_print_news); //вызываем функцию вывода RSS-новостей Но лента RSS выводится некорректно с ненужными кавычками во круг блока новости, то есть название новости в начале и дата в конце выводится корректно, а все что между ними в кавычках (смотрел в консоле). Попытался в консоле отредактировать как HTML, что б посмотреть как будет и кавычки исчезают, не понимаю как они туда попали. Подскажите пожалуйста. write_rss.php: PHP: function print_rss($url_rss,$file_rss,$hclock,$kol_print_news) { //$url_rss - URL-адрес RSS потока //$file_rss - адресс файла для хранения RSS-новостей //$hclock - время обновления, в часах //$kol_print_news - количество выводимых новостей if (!file_exists($file_rss) || ( filemtime($file_rss) + $hclock*60*60 < time() ) )//если файл не сохраняли, то сохраняем на локальном сервере или если существует, то проверяем устарел ли файл (не более Х часов назад он записан) { if (@!copy ($url_rss,$file_rss)) return (false); $text_rss=file($file_rss); $text_rss=implode("",$text_rss); //преобразуем кодировку данных //если не нежно конвертировать кодировку, то комментируем ниже идущее условие или редактируем if (preg_match('/<?xml[^>]+encoding[\s]*=[\s]*("|\')windows-1251("|\')[^>]+?>/i', $text_rss)) { $text_rss = iconv("cp1251", "utf-8", $text_rss); file_put_contents($file_rss, $text_rss);//пишем данные обратно в файл } } $text_rss=file($file_rss); $text_rss=implode("",$text_rss); $url_image = ""; $image_is=preg_match("#<image>(.*?)</image>#is",$text_rss,$image_m); if ( $image_is ) { $image_url_is = preg_match("#<url>(.*?)</url>#is",$image_m[0],$image_t); if ( $image_url_is ) $url_image = $image_t[1]; } $mas_item=array(); preg_match_all("#<item>.*?</item>#is",$text_rss,$mas_item); $one_item=array(); $t=""; $t.=( $url_image ? "<div><img src='".$url_image."' ></div>" :""); $kol=0; if (sizeof($mas_item)>0) { foreach ($mas_item[0] as $one_item) { $date = ""; $kol++; $t_is=preg_match("#<title>(.*?)</title>#is",$one_item,$title); $l_is=preg_match("#<link>(.*?)</link>#is",$one_item,$link); $d_is=preg_match("#<description>(.*?)</description>#is",$one_item,$description); $date_is=preg_match("#<pubDate>(.*?)</pubDate>#is",$one_item,$date_t); if ($t_is && $l_is) { $title[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#eis","'\\1'",$title[1]); $link[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#eis","'\\1'",$link[1]); $description[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#eis","'\\1'",$description[1]); if ( $date_is ) $date = strtotime($date_t[1]); $t.="<div><a href='".$link[1]."' target='_blank'>".$title[1]."</a> <br>" .$description[1] .( $date ? "<br>".date("d.n.Y",$date) : "" ) ."</div>"; } if ($kol >= $kol_print_news) break; } } echo ($t); return (true); }
Вместо регулярных выражений используй simpleXML https://secure.php.net/manual/ru/simplexml.examples-basic.php
RSS файл скачивай раз в час, чтобы его не скачивать каждый раз когда кто-то зайдёт на твой сайт. Можно сделать через CRON. Потом по примеру из документации ты можешь в цикле обойти файл и вывести его содержание как тебе нужно.
Нашел такое решение, к сожалению мозгов не хватает пока самому написать подобное, есть ли в этом коде не добрые нюансы? PHP: $url = "https://aw.mail.ru/rss.xml"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $output = curl_exec($ch); curl_close($ch); $items = simplexml_load_string($output); $items = $items->channel; foreach ($items->item as $item) { echo "<a href='$item->link'>".$item->title."</a><br>"; echo $item->description."<br>"; }
Ну решение, как решение. Только обращение к curl время занимает, посему denis01 тебе и сказал, записывать его в файл один раз в час. Да и при высокой посещаемости сайт-источник rss-а может твой сервер забанить, поскольку ты будешь им большую нагрузку создавать. А вряд ли у них rss чаще, чем раз в час обновляется.
У моего хост провайдера есть услуга CRON но мне нужно ввести команду, написано что только для знающих Linux, время задания я выставил, а вот что за команда не понятно, файл, который должен запуститься раз в час - write_rss.php
варианты: php путь/write_rss.php /usr/bin/php write_rss.php wget -O - -q -t 1 http://твой-сайт.ru/write_rss.php Последний, ИМХО, на крайний случай, я его не люблю, поскольку php дёргается через веб-сервер, с ненужными ограничениями, которые обычно в cli-варианте отсутствуют. Но иногда первые два хостинги делать не позволяют первые два варианта Путь можно посмотреть, выведя __FILE__ Если нет в панели автоматического прописывания времени, то читать https://ru.wikipedia.org/wiki/Cron