Да, только из этого =) Спасибо огромное, помогло =) апд: всплыла такая проблема - сделал это на "черновике" сайта - все отлично работало. Залил на "чистовой" вариант - отображаються либо "крякозяблы" из последней цытаты (без добавления $item['title'] = iconv('UTF-8','CP1251',$item['title']); ) либо все до места новостей и ничего после (белый лист..).. что это может быть и как его решить? =(
Класс для преобразования XML в массив. http://www.phpclasses.org/browse/package/3598.html Класс для преобразования массива в XML http://www.phpclasses.org/browse/package/1826.html - легко переделывается под PHP 4
Функция для преобразования XML в массив PHP 5+ PHP: <?php $array = (array)simplexml_load_string("rss.xml");
А вот подскажите, не совсем в тему. В приведенном скрипте импорта RSS выводятся в качестве анонсов первые 150 символов статьи. А если при разбиении окажутся порезанными парные тэги, то результат будет совсем уж некрасивым. Незакрытый <b> исказит шрифты, а ссылки могут наслоиться друг на друга. Посему вопрос, что можете посоветовать, кроме неприменения тэгов? Можно ли как-то скопом закрыть их все?
Я вот тоже читаю топик и не совсем понял зачем вообще нужны классы если есть давно SimpleXML который на уря работает с XML в том числе и RSS каналами, давно написал себе модуль граббера который не только грабит анонс но и всё содержимое по тэгам поиска + сливает картинки (Алгоритм работы как у любого платного граббера тот же NewsGrabber).
Уважаемый Entrery в начале темы выложил переделаный код 440Hz, все замечательно работает, но вот картинку из новости убивает, вот часть кода, как я думаю именно она очищает текст от всякого хлама, но там есть картинка, ребята как зделать чтоб картинка осталась? PHP: <? $DESC= str_replace("<![CDATA[","",$DESC); $DESC= str_replace("]]>","",$DESC); echo "<ul> <li class=\"cat-item cat-item-1\">".$DESC."...</li>"; ?>
помогите кто нибудь! как сделать чтобы этот код (представлен ниже) мог выводить новости постранично (например 20 новостей по 5 на страницу = 4 страницы) этот код подцепляю к странице вывода так <? echo DisplayRss("http://откуда брать новости", сколько выводить на странице); ?> Видел код пейджера от господина 440hz но ничего в нем не понял, вот если б их обединить как нибудь)) PHP: <?php // выдирание RSS потоков // 440hz ### TOOLS ### function GetXMLFirstVal($r,$t) { if(preg_match_all('/<('.$t.')>(.*)<\/\\1>/Usi',$r,$o)) return $o[2][0]; return false; } function GetXMLAllVal($r,$t) { if(preg_match_all('/<('.$t.')>(.*)<\/\\1>/Usi',$r,$o)) return $o[2]; return array(); } function GetStream($URL,$mode=0) { switch($mode) { // php case 0: $results = file_get_contents($URL); break; // CURL case 1: $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $URL); // Destination URL curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // Output to a variable curl_setopt ($ch, CURLOPT_POST, 0); // Use HTTP POST curl_setopt ($ch, CURLOPT_TIMEOUT, 20); // Default Timeout $results = curl_exec($ch); if(curl_error($ch)) { print_r(curl_getinfo($ch)); exit(); } break; // SOCKETS case 2: $info = parse_url($URL); $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket < 0) { echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n"; exit(); } $result = socket_connect($socket, $info['host'], 80); if ($result < 0) { echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n"; } $in = "GET ".$info['path']." HTTP/1.1\r\n"; $in .= "Host: ".$info['host']."\r\n"; $in .= "Connection: Close\r\n\r\n"; socket_write($socket, $in, strlen($in)); $out = ''; $results = ''; while ($out = socket_read($socket, 2048)) { $results .= $out; } socket_close($socket); break; default: $results = ''; } return $results; } ### TOOLS ### // RSS потоки // ТОЛЬКО ссылки БЕЗ параметров! // get.rss?a=b непокатит. тогда нужно юзать CURL /* $RSSS = array(); $RSSS[] = 'http://tarmans.kombats.ru/?module=news&cmd=rss'; $RSSS[] = 'http://www.paladins.ru/rss.php'; */ function DisplayRss($RSS,$j) // перебираем потоки { //print("\n$RSS"); // получаем контент // 0 - php // 1- curl // 2- sock $XML = GetStream($RSS,0); if($XML) { // получаеми список всех ITEM $ITEMS = GetXMLAllVal($XML,'item'); $g=0; // перебираем ITEM foreach($ITEMS AS $ITEM) { $g++; // получаем данные $TITLE = GetXMLFirstVal($ITEM,'title'); $LINK = GetXMLFirstVal($ITEM,'link'); $DESC = GetXMLFirstVal($ITEM,'description'); $DATE = GetXMLFirstVal($ITEM,'pubDate'); $CAT = GetXMLFirstVal($ITEM,'category'); // ver 2.0 if(!$DATE) { $DATE = GetXMLFirstVal($ITEM,'dc:date'); } // конвертим дату в unixtime if($DATE) $DATE = strtotime($DATE); else $DATE = time(); // преобразуем спецсимволы $TITLE = html_entity_decode($TITLE,ENT_QUOTES); $DESC = html_entity_decode($DESC,ENT_QUOTES); $CAT = html_entity_decode($CAT,ENT_QUOTES); print("\n<ul> <a href = '$LINK' target=_blank > $TITLE </a> "); $DESC=strip_tags($DESC); $sl = strlen($DESC); if($sl>157){ $DESC = str_split($DESC,156); $DESC = trim($DESC[0]); } $DESC= str_replace("<![CDATA[","",$DESC); $DESC= str_replace("]]>","",$DESC); echo "<li><i>".$DESC."...</i></li>"; echo "<br>"; echo "</ul>"; if ($g==$j){break;} } } } // что б в шелле строку переводило ... print("\n"); ?> [/php]
а чуть не забыл надо чтобы он еще и русский понимал ато выдает иероглифы? и еще как сделать чтобы в титле страници выводил заголовок первой новости?
http://rssphp.net/ - отличный грабер rss, xml. Лень не дает описать все возможности. Но смею советовать...
Симптом тот же. Настройка iconv() на хостинге: Код (Text): iconv iconv support enabled iconv implementation glibc iconv library version 1.11 Directive Local Value Master Value iconv.input_encoding ISO-8859-1 ISO-8859-1 iconv.internal_encoding ISO-8859-1 ISO-8859-1 iconv.output_encoding ISO-8859-1 ISO-8859-1 Что может помочь?
Подскажите как в этом коде http://forum.searchengines.ru/showpost. ... stcount=11 исправить чтобы удалить <![CDATA[ и ]] обычным str_replace не выходит! а код хороший.
Забей на него, юзай SimpleXML (сам определяет кодировку RSS файла, а выход даёт в UTF-8, последнее как-то можно настроить, но я не помню) PHP: <?php $rss = simplexml_load_file('http://news.yandex.ru/hardware.rss'); ?> <?foreach($rss->channel->item as $item):?> <a href="<?=$item->link?>"><?=$item->title?></a><br> <?=$item->description?><br> Date: <?=$item->pubDate?><hr> <?endforeach?>
круто...спасибо. Владсон. а последнее исправить можно iconv ? или как там тема.. мне тож надо получить UTF-8..а то что я импортирую в cp1251 т.е. cp1251 --> UTF-8 и потом парсу давать.. пральна так?*
PHP: <?=$item->description?> PHP: <?=iconv('utf-8', 'windows-1251', $item->description)?> И аналогично с PHP: <?=$item->title?> PHP: <?=iconv('utf-8', 'windows-1251', $item->title)?> Что тут не понятного ? Т.е PHP: <?php $rss = simplexml_load_file('http://news.yandex.ru/hardware.rss'); ?> <?foreach($rss->channel->item as $item):?> <a href="<?=$item->link?>"><?=iconv('utf-8', 'windows-1251', $item->title)?></a><br> <?=iconv('utf-8', 'windows-1251', $item->description)?><br> Date: <?=$item->pubDate?><hr> <?endforeach?>
Вопрос интересный... Похожая проблема, только связанна какраз не с импортом, а экспортом RSS. Как можно обрезать все теги? Именно обрезать их, а не обработать htmlspecialchars() , чтобы не портили вид новостей. Нужно убрать все тэги из новости. Интуитивно чувствую, что как-то можно решить с помощью регулярок, но с ними знаком не на должном уровне. ----------------------------------------------------------- UPD Спасибо, но уже нашёл выход strip_tags()
Cкачал, импортер RSS, предложенный .50. Вещь действительно хорошая. Только там не предусмотрены русские кодировки. При импорте с русскоязычных лент выводит обычно в utf-8. Может, кто-нибудь сможет помочь вписать туда русские кодировки. (если это возможно, конечно) Я сам не программист, поэтому до конца не понимаю... Вот сам импортер: Код (Text): <?php /* RSS_PHP - the PHP DOM based RSS Parser Author: <rssphp.net> Published: 200801 :: blacknet :: via rssphp.net RSS_PHP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY. Usage: See the documentation at http://rssphp.net/documentation Examples: Can be found online at http://rssphp.net/examples */ class rss_php { public $document; public $channel; public $items; /**************************** public load methods ***/ # load RSS by URL public function load($url=false, $unblock=true) { if($url) { if($unblock) { $this->loadParser(file_get_contents($url, false, $this->randomContext())); } else { $this->loadParser(file_get_contents($url)); } } } # load raw RSS data public function loadRSS($rawxml=false) { if($rawxml) { $this->loadParser($rawxml); } } /**************************** public load methods @param $includeAttributes BOOLEAN return array; ***/ # return full rss array public function getRSS($includeAttributes=false) { if($includeAttributes) { return $this->document; } return $this->valueReturner(); } # return channel data public function getChannel($includeAttributes=false) { if($includeAttributes) { return $this->channel; } return $this->valueReturner($this->channel); } # return rss items public function getItems($includeAttributes=false) { if($includeAttributes) { return $this->items; } return $this->valueReturner($this->items); } /**************************** internal methods ***/ private function loadParser($rss=false) { if($rss) { $this->document = array(); $this->channel = array(); $this->items = array(); $DOMDocument = new DOMDocument; $DOMDocument->strictErrorChecking = false; $DOMDocument->loadXML($rss); $this->document = $this->extractDOM($DOMDocument->childNodes); } } private function valueReturner($valueBlock=false) { if(!$valueBlock) { $valueBlock = $this->document; } foreach($valueBlock as $valueName => $values) { if(isset($values['value'])) { $values = $values['value']; } if(is_array($values)) { $valueBlock[$valueName] = $this->valueReturner($values); } else { $valueBlock[$valueName] = $values; } } return $valueBlock; } private function extractDOM($nodeList,$parentNodeName=false) { $itemCounter = 0; foreach($nodeList as $values) { if(substr($values->nodeName,0,1) != '#') { if($values->nodeName == 'item') { $nodeName = $values->nodeName.':'.$itemCounter; $itemCounter++; } else { $nodeName = $values->nodeName; } $tempNode[$nodeName] = array(); if($values->attributes) { for($i=0;$values->attributes->item($i);$i++) { $tempNode[$nodeName]['properties'][$values->attributes->item($i)->nodeName] = $values->attributes->item($i)->nodeValue; } } if(!$values->firstChild) { $tempNode[$nodeName]['value'] = $values->textContent; } else { $tempNode[$nodeName]['value'] = $this->extractDOM($values->childNodes, $values->nodeName); } if(in_array($parentNodeName, array('channel','rdf:RDF'))) { if($values->nodeName == 'item') { $this->items[] = $tempNode[$nodeName]['value']; } elseif(!in_array($values->nodeName, array('rss','channel'))) { $this->channel[$values->nodeName] = $tempNode[$nodeName]; } } } elseif(substr($values->nodeName,1) == 'text') { $tempValue = trim(preg_replace('/\s\s+/',' ',str_replace("\n",' ', $values->textContent))); if($tempValue) { $tempNode = $tempValue; } } elseif(substr($values->nodeName,1) == 'cdata-section'){ $tempNode = $values->textContent; } } return $tempNode; } private function randomContext() { $headerstrings = array(); $headerstrings['User-Agent'] = 'Mozilla/5.0 (Windows; U; Windows NT 5.'.rand(0,2).'; en-US; rv:1.'.rand(2,9).'.'.rand(0,4).'.'.rand(1,9).') Gecko/2007'.rand(10,12).rand(10,30).' Firefox/2.0.'.rand(0,1).'.'.rand(1,9); $headerstrings['Accept-Charset'] = rand(0,1) ? 'en-gb,en;q=0.'.rand(3,8) : 'en-us,en;q=0.'.rand(3,8); $headerstrings['Accept-Language'] = 'en-us,en;q=0.'.rand(4,6); $setHeaders = 'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'."\r\n". 'Accept-Charset: '.$headerstrings['Accept-Charset']."\r\n". 'Accept-Language: '.$headerstrings['Accept-Language']."\r\n". 'User-Agent: '.$headerstrings['User-Agent']."\r\n"; $contextOptions = array( 'http'=>array( 'method'=>"GET", 'header'=>$setHeaders ) ); return stream_context_create($contextOptions); } } ?>
подскажите плиз... вот нашел код PHP: <?php /********************************************************** * Parse XML data into an array structure * * Usage: array parse_rss ( string data ) * **********************************************************/ function parse_rss($reg_exp, $xml_data) { preg_match_all($reg_exp, $xml_data, $temp); return array( 'count'=>count($temp[0]), 'title'=>$temp[1], 'link'=>$temp[2], 'desc'=>$temp[3], 'pubdate'=>$temp[4] //добавлено ); } /********************************************************** * Parse Array data into an HTML structure * * Usage: string parse_rss ( array data ) * **********************************************************/ function output_rss($pattern, $rss_data) { $temp = ""; for($i=0; $i<$rss_data['count']; $i++) { $temp .= sprintf($pattern, $rss_data['link'][$i], html_entity_decode($rss_data['title'][$i]), html_entity_decode($rss_data['desc'][$i]), $rss_data['pubdate'][$i] //добавлено ); } return $temp; } /********************************************************** * Settings * **********************************************************/ $url = 'http://fashionstreet.ru/news/rss.xml'; $reg_exp = '#<item>.*?<title>(.*?)<\/title>.*?'; $reg_exp .='<link>(.*?)<\/link>.*?<description>'; $reg_exp .='(.*?)<\/description>.*?<pubDate>'; //исправлено $reg_exp .= '(.*?)<\/pubDate>.*?<\/item>#si'; //добавлено $pattern = '<a href="%s">%s</a><br>%s<br>Date: %s<hr>'; /********************************************************** * Main script * **********************************************************/ if ( $xml_data = file_get_contents($url) ) { $rss_data = parse_rss($reg_exp, $xml_data); echo output_rss($pattern, $rss_data); } /********************************************************** * The END * **********************************************************/ ?> что нужно удалить чтоб выводились только title с линками и в догонку вопрос... например чтоб тока первые 5 выводились
а вообще может ктонить дать код чтоб новости пихались сразу в БД, обновление вручную сделать в общем надо чтоб новости с другого сайта пихались в БД а потом выводились из неё на моем сайте как? )))
Добрый день, у меня здесь появилась проблема, подскажите что не так, сам не программист... Дело в чем, нужно спарсить с сайта RSS новости и положить аккуратно в базу, вроде все хорошо работало с кодом ниже, но появилась проблема, когда появляются новые новости, начинаются дублироваться и старые новости, решил сделать проверку, но почемуто не работает (второй код)... PHP: <? $query = "INSERT INTO b_iblock_element (NAME,DETAIL_TEXT,DATE_CREATE,TIMESTAMP_X,ACTIVE_FROM,IBLOCK_ID,DETAIL_TEXT_TYPE,CREATED_BY) VALUES('". $TITLE."','".$DESC."','".date('Y-m-d H:i:s',$DATE)."','".date('Y-m-d H:i:s',$DATE)."','".date('Y-m-d H:i:s',$DATE)."','".$BLOCK."','".$TEXTTYPE."','".$CREATEDBY."')"; $result = mysql_query($query); print($result); ?> PHP: <? $newsold = mysql_query("SELECT * FROM b_iblock_element WHERE NAME = '$TITLE'"); if(!$newsold) { $query = "INSERT INTO b_iblock_element (NAME,DETAIL_TEXT,DATE_CREATE,TIMESTAMP_X,ACTIVE_FROM,IBLOCK_ID,DETAIL_TEXT_TYPE,CREATED_BY) VALUES('". $TITLE."','".$DESC."','".date('Y-m-d H:i:s',$DATE)."','".date('Y-m-d H:i:s',$DATE)."','".date('Y-m-d H:i:s',$DATE)."','".$BLOCK."','".$TEXTTYPE."','".$CREATEDBY."')"; $result = mysql_query($query); print($result); print("insert"); } else { $query = "UPDATE b_iblock_element SET NAME = '".$TITLE."', DETAIL_TEXT = '".$DESC."', DATE_CREATE = '".date('Y-m-d H:i:s',$DATE)."', TIMESTAMP_X = ".date('Y-m-d H:i:s',$DATE)."', ACTIVE_FROM = ".date('Y-m-d H:i:s',$DATE)."', IBLOCK_ID = ".$BLOCK."', DETAIL_TEXT_TYPE = ".$TEXTTYPE."', CREATED_BY = ".$CREATEDBY."' WHERE NAME = '$TITLE'"; $result = mysql_query($query); print($result); print("update"); } ?> PS вот результат работы скрипта с последним кодом, только первые 2 новости он должен добавить а не просто обновить... Код (Text): [2009-05-26 15:02:39] - [Что будет с Сердюковым]update [2009-05-26 14:08:38] - [Ревизия на границе]update [2009-05-26 14:05:23] - [Таможенный пункт пропуска будет установлен на Финляндском вокзале Санкт- Петербурга]update [2009-05-26 13:59:07] - [Новый логоцентр в ожидании арендаторов]update [2009-05-26 13:52:10] - [Эффект новой логистики АВТОВАЗа]update