Aujourd'hui, j'ai eu à récupérer un flux RSS externe et à l'intégrer sur le site web d'un de nos clients. Évidemment, c'était en supposant que le RSS soit formatté correctement...
La difficulté que j'ai rencontré était que des caractères illégaux s'étaient glissés dans le texte, en particulier le symbole "&", qui n'est pas considéré valide, tout comme les balises HTML. N'ayant pas le contrôle sur le flux en question, je cherchais un moyen de contourner le problème, à la plus grande satisfaction de mon client.
Pour y remédier, je me suis simplement arrangé pour entourer le texte de sections CDATA, qui font en sorte que les caractères spéciaux et le code HTML provenant d'un éditeur de texte riche (gras, italique, etc.) ne soient pas analysés et validés en tant que structure du document XML.
D'abord, j'ai lancé une commande cUrl pour capturer les résultats situés sur le site distant. Ensuite, j'ai effectué une série de remplacement pour insérer les sections CDATA (Character Data) aux bons endroits. Le texte compris dans une section CDATA doit toujours être placé entre les marqueurs <![CDATA[ et se ]]-->.
Ce que j'ai fait pouvait ressembler à ceci :
// url du RSSUne fois les sections insérées, le RSS a pu s'afficher correctement, tant dans Internet Explorer que dans Firefox. Contrairement à ce dernier, IE 7 reconnaissait l'erreur mais n'effectuait pas la correction, se contentant de lancer un message de syntaxe invalide :
$url = 'http://www.site.com/rss-avec-syntaxe-invalide.php';
// initialiser une session cUrl
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// obtenir le contenu
$xml = curl_exec($ch);
// effectuer les remplacements
// j'aurais aussi bien pu le faire par RegExp
$xml = str_replace("<title>", "<title><![CDATA[", $xml);
$xml = str_replace("</title>", "]]></title>", $xml);
$xml = str_replace("<description>", "<description><![CDATA[", $xml);
$xml = str_replace("</description>", "]]></description>", $xml);
curl_close($ch);
// afficher le flux dans ma page PHP
echo $xml;
Internet Explorer ne peut pas afficher ce flux
Ce flux contient des erreurs de code.
Aucun espace blanc n'est autorisé à cet emplacement.