Aide - Recherche - Membres - Calendrier
Version complète : XML+PHP : problème de lecture <description> en CDATA
Forum Développeur - Administration serveur, programmation et base de données > Programmation > XML et XSL
.: zó :.
bonjour !

J'ai hérité d'un lecteur RSS en PHP, que j'alimente avec un flux XML.
Le problème est que pour ajouter des éléments particuliers dans mon champs <description> (gras, breakers, liens etc.), je dois ajouter la mention <![CDATA[ mon texte ]]>, sans quoi mon flux est bien lu avec mon lecteur, mais pas par les lecteurs les plus communs (firefox, netvibes etc.).
Grâce au CDATA, mon flux est désormais bien interprété par les lecteurs communs, mais plus par le mien : la description ne s'affiche pas.

Y aurait-il une mention relative au CDATA à ajouter dans le PHP ?
Mon lecteur PHP :

PHP

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>title</title>
</head>
<body>
<p>Test lecteur flux XML avec CDATA</p>
<p>

<?php
# Configuration
$fichier_xml = "flux_cdata.xml";
$nombre_debut = 0;
$nombre_limite = 5;
$nb_jour_limite = 90;
$jourlimite = mktime(0, 0, 0, date("m") , (date("d")-$nb_jour_limite), date("Y"));

# Affichage du Flux
$raw = file_get_contents($fichier_xml);
if ($raw) {

if(eregi("<item>(.*)</item>",$raw,$rawitems)){

$items = explode("<item>", $rawitems[0]);
$nb = count($items);
$maximum = (($nb-1) < $nombre_limite) ? ($nb-1) : $nombre_limite;

for ($i=$nombre_debut;$i<$maximum;$i++) {

eregi("<title>(.*)</title>",$items[$i+1], $title);
eregi("<link>(.*)</link>",$items[$i+1], $link);
eregi("<description>(.*)</description>",$items[$i+1], $description);
eregi("<pubDate>(.*)</pubDate>",$items[$i+1], $pubDate);
eregi("<enclosure url=(.*)/>",$items[$i+1], $enclosure);

$date_timestamp = strtotime($pubDate[1]);
$date_02 = date('d m y',$date_timestamp);
$date_03 = date('d m y',$jourlimite);


if ($date_timestamp > $jourlimite) {
echo "<li>";

if ((strstr($link[1], 'http://www.le-rsi.fr')) and (strstr($link[1], '.php'))){
echo "<a href=\"".$link[1]."\"><span class=\"titreBlocTab\"><strong>".$title[1]."</strong></span></a>";

} else {
echo "<a href=\"".$link[1]."\" target=\"_blank\"><span class=\"titreBlocTab\"><strong>".$title[1]."</strong></span></a>";
}


if (strstr($enclosure[1], 'image/jpeg')) {
if (strstr($link[1], 'http://www.le-rsi.fr')) {

echo "<div class=\"illu_actu\"><a href=\"".$link[1]."\"><img src=".$enclosure[1]." width=\"74\" border=\"0\"></a></div>";
} else {
echo "<div class=\"illu_actu\"><a href=\"".$link[1]."\" target=\"_blank\"><img src=".$enclosure[1]." width=\"74\" border=\"0\"></a></div>";
}
} else {
/*RIEN*/
}

echo "<div class=\"txt_illu_actu\"><span class=\"texteBlocTab\">".$description[1]."<br /></span></div>";
echo "<div class=\"cleaner_actu\"></div>";
echo "</li>";

} else {
/*echo "<br /> RIEN" ;*/
}
}
}
}
?>

</p>
</body>
</html>


Mon flux XML :

PHP

<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">

<channel>
<title>Actualités</title>
<description>Actualités du site</description>
<lastBuildDate>Mon, 30 June 2008 14:00:00 +0100</lastBuildDate>
<link>http://www.google.fr</link>

<item>
<title>title 1</title>
<link>http://www.google.fr</link>
<description> <![CDATA[ <strong> decription avec du CDATA. Br : <br>
a : <a href="http://en.wikipedia.org/wiki/CDATA" target="_blank">lien</a> </strong> ]]>
</description>
<category>Actualité</category>
<pubDate>Mon, 30 June 2008 14:00:00 +0100</pubDate>
<enclosure url="" alt="" title="" length="" type="" />
</item>

<item>
<title>title 2</title>
<link>http://www.google.fr</link>
<description>du texte iso sans cdata pour la description</description>
<category>Actualité</category>
<pubDate>Fri, 25 July 2008 17:00:00 +0100</pubDate>
<enclosure url="" alt="" title="" length="" type="" />
</item>

</channel>
</rss>


Le résultat se trouve ici. La description (non affichée) du 1er item contient du CDATA et la seconde n'en contient pas.

PS : je ne suis pas développeur et ne connais donc pas le PHP...

Merci d'avance !
Ldo
vu que tu n'utilise pas le parser xml de php, mais une solution à base de ereg
à mon avis il faut que tu vire les cdata à la main

un truc du genre
$varDescription= eregi_replace('<\!\[CDATA\[|\]\]>', '', $varDescription);
.: zó :.
Je crois avoir trouvé un morceau de code qui fait l'affaire.
Je testerai plus en profondeur et vous dirai si la solution est vraiment celle attendue.
à ajouter ligne 37 dans le code php cité dans le dernier message :

PHP


if( eregi("<\!\[CDATA\[(.*)\]\]>",$description[1], $cdata) ) {
$description[1]=$cdata[1];
}
else {
$description[1]=$description[1];
}

if( eregi("<p>(.*)</p>",$description[1], $cdata) ) {
$description[1]=$cdata[1];
}
else {
$description[1]=$description[1];
}

.: zó :.
Je confirme, ça fonctionne chez moi
Ldo
c'est bien ce que je disait, il fallait virer le cdata à la main

par contre des trucs comme ça : $description[1]=$description[1];
ça ne sert strictement à rien smile.gif
tu peut virer les else, ils sont inutile
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.