Se connecter / S'enregistrer
Votre question

Lecteur RSS Complet

Tags :
  • Rss
  • Programmation
Dernière réponse : dans Programmation
11 Janvier 2008 03:22:37

Salut, :hello: 

j'ai un script Php de lecture de contenu de flux rss/Atom(tout le contenu) du type FeedBurener :love:  que j'ai installer sur mon annuaire seulement j'ai un problème c'est qand il sagit d'afficher des caracteres speciaux il m'affiche des symboles du type : ’y a… ù ....
exemple sur la page :
http://guide-oueb.evoconcept.net/rss-site.php?adresse=http://obuzz.wordpress.com/feed/

Voici le Code Source de ma page rss-site.php :

  1. <?
  2. if(isset($_GET["adresse"])) {
  3. $adresse = ($_GET["adresse"]);
  4. if (preg_match("#^http://.([\w./-]+)$#i",$adresse,$ret)) {
  5. $fil = $ret[0];
  6.  
  7. // fonctions de nettoyage du texte rŽcupŽrŽ
  8.  
  9. function clean_text($text) {
  10. $text = str_replace('<','<',$text);
  11. $text = str_replace('>','>',$text);
  12. $text = str_replace('"','"',$text);
  13. $text = str_replace('&','&',$text);
  14. if ($encodage == 'utf-8') {
  15. $text = utf8_decode($text);
  16. }
  17. return $text;
  18. }
  19.  
  20. function clean_date($date)
  21. {
  22. // si 'AAAA-MM-JJTHH:MM:SS+00:00' ou 'AAAA-MM-JJTHH:MM:SSZ'
  23. if (ereg("^[0-9]",$date) and ereg("(([[:digit:]]|-)*)T(([[:digit:]]|:)*)[^[:digit:]].*",$date,$temp)) {
  24. $date = $temp[1].' '.$temp[3];
  25. }
  26. $date = date('d/m/Y', strtotime($date));
  27. return $date;
  28. }
  29.  
  30. include 'rss_read.inc.php';
  31.  
  32. // crŽer l'instance
  33. $rss = new rss_read();
  34.  
  35. // caractres parasites pouvant tre contenus dans le fils rss et ˆ remplacer par d'autres, doit tre invoquŽ avant parsefile
  36. // cette fonction est optionnelle et ne doit tre utilisŽe que pour certains fils.
  37. $avant = array("'","•");
  38. $apres = array("'",'-');
  39. $rss -> to_replace_with($avant, $apres);
  40.  
  41. // parser le fichier news avec Žventuellement un nombre max
  42. $rss -> parsefile($fil,20);
  43.  
  44. if (!$rss) {
  45. exit('</a>Fichier rss incorrect !<sup>[<a href="#note1">1</a>]</sup>');
  46. }
  47.  
  48. // recupŽration de l'encodage du fil iso ou utf vide si celui-ci n'est pas indiquŽ
  49. $encode = $rss -> get_encoding();
  50.  
  51. // recupŽration des donnŽes sur le channel
  52. $channel = $rss -> get_channel();
  53.  
  54. }
  55. ?>
  56. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  57. <html>
  58. <head>
  59. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  60. <title>flux <? echo clean_text($channel['title'], $encode);?> sur l'annuaire generaliste gratuit guide-oueb</title>
  61. <meta name="description" content="nouveautés du site <? echo $_GET["adresse"];?> sur l'annuaire generaliste gratuit guide-oueb referencement de flux rss automatique gratuit." />
  62. <meta name="keywords" content="rss, <? echo $_GET["adresse"];?>, flux rss, actualites, nouveautes, guide-oueb" />
  63. <meta name="language" content="fr" />
  64. <meta name="robots" content="all | follow | index" />
  65. <meta name="rating" content="General" />
  66. <meta name="expires" content="never" />
  67.  
  68. <style type="text/css">
  69. <!--
  70. .Style1 {color: #FFFFFF}
  71. -->
  72. </style>
  73. </head>
  74.  
  75.  
  76. <body style="background-color: rgb(235, 235, 235);" leftmargin="0" topmargin="0" link="#5c5c5c" marginheight="0" marginwidth="0">
  77.  
  78. <table class="bg" border="0" cellpadding="0" cellspacing="0" height="98" width="100%">
  79.  
  80. <tbody>
  81.  
  82. <tr>
  83.  
  84. <td>
  85. <table align="center" border="0" cellpadding="0" cellspacing="0" width="772">
  86.  
  87. <tbody>
  88.  
  89. <tr>
  90.  
  91. <td align="center" bgcolor="#FF0000"><table border="0" cellpadding="0" cellspacing="0" width="770">
  92.  
  93. <tbody>
  94.  
  95. <tr>
  96.  
  97. <td width="770" height="130" align="center" bordercolor="#E0DFE3" bgcolor="#FF0000"><?php include('haut-site.php'); ?>
  98. <table border="0" cellpadding="0" cellspacing="0" width="770">
  99. <tbody>
  100. </tbody>
  101. </table>
  102. <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="<a href="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" rel="nofollow" target="_blank">http://download.macromedia.com/pub/shockwave/cabs/flash...</a>" width="771" height="131">
  103. <param name="movie" value="1.swf">
  104. <param name="quality" value="high">
  105. <embed src="1.swf" quality="high" pluginspage="<a href="http://www.macromedia.com/go/getflashplayer" rel="nofollow" target="_blank">http://www.macromedia.com/go/getflashplayer</a>" type="application/x-shockwave-flash" width="771" height="131"></embed>
  106. </object></td></tr>
  107.  
  108. <tr>
  109.  
  110. <td align="center" bgcolor="#FF0000">
  111. <?php include('menu.php'); ?></td>
  112. </tr>
  113. </tbody>
  114. </table>
  115.  
  116. </td>
  117.  
  118. </tr>
  119.  
  120. <tr>
  121.  
  122. <td align="center" bgcolor="#333333" valign="top">
  123. <table border="0" cellpadding="0" cellspacing="0" width="770">
  124.  
  125. <tbody>
  126.  
  127. <tr>
  128.  
  129. <td bgcolor="#5c5c5c" valign="top" width="222"><?php include('menu2.php'); ?><td bgcolor="#ffffff" valign="top" width="548"><?php
  130. //fichier qui contient tout ce qui doit venir avant le code de l'annuaire (menu de gauche....)
  131. include("before.php");
  132.  
  133. include ("haut.php"); //lien divers de l'annuaire (top clics, top votes, ajout,...)
  134. ?>
  135. <?php
  136. if(isset($_GET["adresse"])) {
  137.  
  138.  
  139. if ($rss -> exist_image()) {
  140. $image = $rss -> get_image();
  141. echo '<table width="100%" border="0"><tr><td width="50%"><h4 align="center"><a href="'.$channel['link'].
  142. '" target="_blank" class="ext2">'.clean_text($channel['title'], $encode)."</a></h4></td>\n<td><center><a href=\""
  143. .$image['link'].'" target="_blank" class="ext"><img src="'.$image['url'].
  144. '" border="0" alt="'.$image['title']."\"></a></center></td></tr></table>\n"; }
  145. else { echo '<h4 align="center"><a href="'.$channel['link'].'" target="_blank" class="ext2">'.clean_text($channel['title'], $encode)."</a></h4>\n"; }
  146.  
  147. // nombre d'items
  148. $nbnews = $rss -> get_num_items();
  149.  
  150. // recup array des donnŽes
  151. $items = $rss -> get_items();
  152.  
  153. // pour affichage des dates au format franais
  154. echo "<ul>\n";
  155. for($i = 0; $i < $nbnews; $i++) {
  156. echo '<li>';
  157. if (trim($items[$i]['pubdate'])!='') {
  158. echo '<b>',clean_date(trim($items[$i]['pubdate'])),' :</b> ';
  159. }
  160. if (trim($items[$i]['author'])!='') {
  161. echo '<span class="vert">',clean_text($items[$i]['author'], $encode),' :</span> ';
  162. }
  163. elseif (trim($items[$i]['dc:creator'])!='') {
  164. echo '<span class="vert">',clean_text($items[$i]['dc:creator'], $encode),' :</span> ';
  165. }
  166. echo '<a class="ext" href="',$items[$i]['link'],'" target="_blank">',clean_text($items[$i]['title'], $encode),'</a>';
  167. if (trim($items[$i]['category'])!="") { echo " <b>(".clean_text($items[$i]['category'], $encode).")</b>"; }
  168. if (trim($items[$i]['description'])!='') {
  169. echo ' :<br />'.clean_text($items[$i]['description'], $encode);
  170. }
  171. echo "</li>\n";
  172. }
  173. echo "</ul>\n";
  174. }
  175. else {echo "<p class=\"rouge\">L'adresse du flux n'est pas valide.<br />";}
  176. }
  177. ?>
  178. <br /><?php echo $nouv ?>
  179. <center><a name="note1"></a><ol>
  180. <li><strong>En cas de difficulté, il est possible que le fichier ne soit pas conforme. Pour le vérifier, voyez <a href="<a href="http://feedvalidator.org/" rel="nofollow" target="_blank">http://feedvalidator.org/</a>" target="_blank" style="color:#FF6600;">Feed Validator</a> ou <a href="<a href="http://rss.scripting.com/" rel="nofollow" target="_blank">http://rss.scripting.com/</a>" target="_blank" style="color:#FF6600;">RSS Validator</a>.</strong></li>
  181. </ol>
  182. </center>
  183. <?
  184. include ("bas.php"); //pied de la page
  185.  
  186. //fichier qui contient tout ce qui doit venir avant le code de l'annuaire (menu de droite....)
  187. include("after.php");
  188.  
  189. ?>
  190. </td>
  191. </tr>
  192. </tbody>
  193. </table>
  194.  
  195. </td>
  196.  
  197. </tr>
  198.  
  199. <tr>
  200.  
  201. <td style="background-color: rgb(255, 0, 0);" align="center" bgcolor="#333333" valign="top"><?php include('bas-site.php'); ?></td>
  202.  
  203. </tr>
  204.  
  205.  
  206. </tbody>
  207. </table>
  208.  
  209. </td>
  210.  
  211. </tr>
  212.  
  213. <tr>
  214.  
  215. <td align="center" height="40" valign="bottom"><? include('copyrite.php');?></td>
  216.  
  217. </tr>
  218.  
  219. </tbody>
  220. </table>
  221.  
  222. </body>
  223. </html>


et Voici le code source de ma page rss_read.inc.php

  1. <?php
  2. // ------------------------------------------------------
  3. // rss_read - classe pour lire des fichiers RSS/RDF/Atom
  4. // Dominique WOJYLAC <<a href="http://wojylac.free.fr&gt" rel="nofollow" target="_blank">http://wojylac.free.fr&gt</a>;
  5. // Distribué sous GNU General Public License.
  6. //
  7. // Version 2.1c
  8. // -------------------------------------------------------
  9.  
  10. class rss_read
  11. {
  12. var $class_version;
  13. var $rss_channel;
  14. var $rss_image;
  15. var $rss_items;
  16. var $rss_textinput;
  17. var $rss_encoding;
  18. var $to_replace;
  19. var $replace_with;
  20. var $mode_agrege;
  21.  
  22. /*
  23. ** initialisation de la classe
  24. */
  25. function rss_read()
  26. {
  27. $this -> class_version = '2.1c';
  28. $this -> rss_channel = array();
  29. $this -> rss_image = array();
  30. $this -> rss_items = array();
  31. $this -> rss_textinput = array();
  32. $this -> rss_encoding = '';
  33. $this -> to_replace = array();
  34. $this -> replace_with = array();
  35. $this -> mode_agrege = true;
  36. }
  37.  
  38. /*
  39. ** initialise le mode
  40. */
  41. function mode_brut()
  42. {
  43. $this -> mode_agrege = false;
  44. }
  45.  
  46. /*
  47. ** initialise les tableau pour remplacement de caractères avant traitement du flux
  48. */
  49. function to_replace_with($avant, $apres)
  50. {
  51. if (!empty($avant)) {
  52. $this -> to_replace = $avant;
  53. }
  54.  
  55. if (!empty($apres)) {
  56. $this -> replace_with = $apres;
  57. }
  58. }
  59.  
  60. /*
  61. ** analyse les entêtes pour trouver Last-Modified
  62. ** retourne la donnée sous forme timestamp ou telle quelle
  63. */
  64. function header_last_modified($headers, $format = true) {
  65. if (preg_match('/HTTP\/1.1 404/', $headers)) {
  66. return false;
  67. }
  68. else if (preg_match("/Last-Modified: ([^\r]*)\r/i", $headers ,$temp)) {
  69. $date_modif = $temp[1];
  70. }
  71. else {
  72. $date_modif = '';
  73. }
  74.  
  75. if ($format == true) {
  76. if (empty($date_modif)) {
  77. return 0;
  78. }
  79. else {
  80. return strtotime($date_modif);
  81. }
  82. }
  83. else {
  84. return $date_modif;
  85. }
  86. }
  87.  
  88. /*
  89. ** date de modification avec fsockopen
  90. */
  91. function get_last_modified($url = '', $format = true) {
  92.  
  93. $url_array = parse_url($url);
  94. $host = $url_array['host'];
  95. $path = $url_array['path'];
  96.  
  97. if (empty($url) or empty($host) or empty($path)) {
  98. return false;
  99. }
  100. $fp = @fsockopen($host, 80);
  101. if (!$fp) {
  102. return false;
  103. }
  104.  
  105. $out = 'HEAD '.$path.' HTTP/1.1'."\r\n".
  106. 'Host: '.$host."\r\n".
  107. 'Connection: Close'."\r\n\r\n";
  108.  
  109. $lines = '';
  110. fwrite($fp, $out);
  111. while (!feof($fp)) {
  112. $lines .= fgets($fp, 1024);
  113. }
  114. fclose($fp);
  115.  
  116. if (empty($lines)) {
  117. return false;
  118. }
  119. else {
  120. return $this -> header_last_modified($lines, $format);
  121. }
  122. }// fin gest_last_modified
  123.  
  124. /*
  125. ** date de modification avec bibliotheque curl
  126. */
  127. function curl_get_last_modified($url = '', $format = true) {
  128. if (empty ($url)) {
  129. return false;
  130. }
  131. $ch = curl_init($url);
  132. // curl_setopt($ch, CURLOPT_URL, $url);
  133. curl_setopt($ch, CURLOPT_HEADER, true);
  134. curl_setopt($ch, CURLOPT_NOBODY, true);
  135. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  136.  
  137. $lines = curl_exec ($ch);
  138. curl_close ($ch);
  139.  
  140. if (empty($lines)) {
  141. return false;
  142. }
  143. else {
  144. return $this -> header_last_modified($lines, $format);
  145. }
  146. }
  147.  
  148. /*
  149. ** analyse le flux
  150. */
  151. function parse_data($data, $max_item = 0)
  152. {
  153. if (preg_match('/encoding="([^"]*)"/i', $data ,$temp)) {
  154. $this -> rss_encoding = strtolower($temp[1]);
  155. }
  156.  
  157. // remplacement eventuel
  158. if (!empty($this -> to_replace) and !empty($this -> replace_with)) {
  159. $data = str_replace($this -> to_replace, $this -> replace_with, $data);
  160. }
  161.  
  162. $xml_parser = xml_parser_create();
  163. xml_parse_into_struct($xml_parser, $data, $vals);
  164.  
  165. $parent = array();
  166. $n_item = 0;
  167. // RSS ou FEED
  168. $fil_type = $vals[0]['tag'];
  169. // $vals = tableau associatif déterminé par la structure du fil
  170. //print_r($vals);
  171. foreach ($vals as $row) {
  172. // $row = tableau associatif correspondant à une ligne de $vals
  173. // 4 indices : tag, type, level, value
  174. foreach ($row as $key => $val) {
  175. ${$key} = $val;
  176. }
  177.  
  178. $tag = strtolower($tag);
  179.  
  180. switch ($type) {
  181. case 'open' :
  182. $parent[$level] = $tag ;
  183. if (($tag == 'item') or ($tag == 'entry')) {
  184. $n_item++;
  185. }
  186. break;
  187.  
  188. case 'close' :
  189. if ($parent[$level] == $tag) {
  190. $parent[$level] = '';
  191. }
  192. break;
  193.  
  194. case 'complete' :
  195. // cas specifiques à atom
  196. if (($fil_type == 'FEED') and ($tag == 'link')) {
  197. $value = $attributes['HREF'];
  198. }
  199.  
  200. if (($fil_type == 'FEED') and ($tag == 'category')) {
  201. $value = $attributes['label'];
  202. }
  203. // cas non spécifiques
  204. if ($this -> mode_agrege) {
  205. switch ($tag) {
  206. case 'dc:subject' :
  207. $tag = 'category';
  208. break;
  209.  
  210. case 'date':
  211. case 'dc:date':
  212. case 'published':
  213. case 'issued':
  214. $tag = 'pubdate';
  215. break;
  216.  
  217. case 'updated':
  218. $tag = 'modified';
  219. break;
  220.  
  221. case 'dc:description':
  222. case 'summary':
  223. case 'content:encoded':
  224. $tag = 'description';
  225. break;
  226.  
  227. case 'dc:rights':
  228. case 'rights':
  229. $tag = 'copyright';
  230. break;
  231.  
  232. case 'dc:creator':
  233. $tag = 'author';
  234. break;
  235. } // fin switch
  236. } // fin if mode agrege
  237.  
  238. switch ($parent[$level - 1]) {
  239. case 'feed':
  240. case 'channel':
  241. $this -> rss_channel[$tag] = $value;
  242. break;
  243.  
  244. case 'entry':
  245. case 'item':
  246. if(($n_item <= $max_item) or ($max_item == 0)) {
  247. $this -> rss_items[$n_item - 1][$tag] = $value;
  248. }
  249. break;
  250.  
  251. case 'image':
  252. $this -> rss_image[$tag] = $value;
  253. break;
  254.  
  255. case 'textinput':
  256. $this -> rss_textinput[$tag] = $value;
  257. break;
  258. } // fin switch $parent
  259. break;
  260. } // fin switch $type
  261. } // fin foreach
  262.  
  263. xml_parser_free($xml_parser);
  264. } // fin parse_data
  265.  
  266. /*
  267. ** ouvrir et lire le flux avec fopen
  268. */
  269. function parsefile($filename, $max_item = 0) {
  270. if(!$fp = @fopen($filename, 'r')) {
  271. return false;
  272. }
  273.  
  274. $lines = '';
  275.  
  276. while (!feof($fp)) {
  277. $lines .= fread($fp, 4096);
  278. }
  279. @fclose($fp);
  280. // ou php >= 4.3
  281. // $lines = file_get_contents($filename);
  282.  
  283. if (empty($lines)) {
  284. return false;
  285. }
  286. else {
  287. $this -> parse_data($lines, $max_item, $mode);
  288. return true;
  289. }
  290. } // fin parsefile
  291.  
  292. /*
  293. ** ouvrir et lire le flux avec bibliotheque curl
  294. */
  295. function curl_parsefile($filename ='', $max_item = 0) {
  296. if (empty($filename)) {
  297. return false;
  298. }
  299.  
  300. $lines = '';
  301. $ch = curl_init($filename);
  302. // curl_setopt($ch, CURLOPT_URL, $filename);
  303. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  304.  
  305. $lines = curl_exec ($ch);
  306. curl_close ($ch);
  307.  
  308. if (empty($lines)) {
  309. return false;
  310. }
  311. else {
  312. $this -> parse_data($lines, $max_item, $mode);
  313. return true;
  314. }
  315. } // fin curl_parsefile
  316.  
  317.  
  318. // encoding
  319. function get_encoding() {
  320. return $this -> rss_encoding;
  321. }
  322.  
  323. // channel
  324. function exist_channel() {
  325. return (!empty($this -> rss_channel) and
  326. !empty($this -> rss_channel['title']) and
  327. !empty($this -> rss_channel['link']));
  328. }
  329.  
  330. function get_channel() {
  331. return $this -> rss_channel;
  332. }
  333.  
  334. // image
  335. function exist_image() {
  336. return (!empty($this -> rss_image['url']));
  337. }
  338.  
  339. function get_image() {
  340. return $this -> rss_image;
  341. }
  342.  
  343. // items
  344. function exist_items() {
  345. return (count($this -> rss_items) > 0);
  346. }
  347.  
  348. function get_items() {
  349. return $this -> rss_items;
  350. }
  351.  
  352. function get_num_items() {
  353. return count($this -> rss_items);
  354. }
  355.  
  356. // input
  357. function exist_textinput() {
  358. return (!empty($this -> rss_textinput) and
  359. !empty($this -> rss_textinput['title']) and
  360. !empty($this -> rss_textinput['link']) and
  361. !empty($this -> rss_textinput['description']) and
  362. !empty($this -> rss_textinput['name']));
  363. }
  364.  
  365. function get_textinput() {
  366. return $this -> rss_textinput;
  367. }
  368. }
  369.  
  370. ?>


Je vous prie de bien vouloir m'aider a trouver une solution.

Merci d'avance .

Autres pages sur : lecteur rss complet

a c 232 L Programmation
11 Janvier 2008 11:42:52

Salut,

C'est un problème d'encodage.
Tu fais un utf8-decode si ta variable $encodage == 'utf8', alors que ta variable $encodage n'est définie nulle part, donc tu ne feras jamais ce utf8-decode.
11 Janvier 2008 14:18:36

j'ai fait cette modification a la fonctionclean_text() et sa marche mieux

  1. function clean_text($text,$encodage) {
  2. $text = str_replace('<','<',$text);
  3. $text = str_replace('>','>',$text);
  4. $text = str_replace('"','"',$text);
  5. $text = str_replace('&','&',$text);
  6. if ($encodage == 'utf-8') {
  7. $text = utf8_decode($text);
  8. }
  9. return $text;
  10. }


http://guide-oueb.evoconcept.net/rss-site.php?adresse=http://obuzz.wordpress.com/feed/

sauf pour les caracteres ' et quelques autres ...

Merci pour votre aide
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS