web-dev-qa-db-fra.com

Meilleure façon d’analyser les flux RSS / Atom avec PHP

J'utilise actuellement Magpie RSS mais cela tombe parfois lorsque le flux RSS ou Atom n'est pas bien formé. Existe-t-il d'autres options pour analyser RSS et = Atom se nourrit de PHP?

130
carson
29
Philip Morton

J'ai toujours utilisé les fonctions SimpleXML intégrées à PHP pour analyser des documents XML. C'est l'un des rares analyseurs syntaxiques génériques qui possède une structure intuitive, ce qui rend extrêmement facile la construction d'une classe significative pour quelque chose de spécifique, comme un flux RSS. En outre, il détectera les avertissements et les erreurs XML et, une fois trouvé, vous pourrez simplement exécuter le code source à l'aide de quelque chose comme HTML Tidy (comme l'a mentionné ceejayoz) pour le nettoyer et le tenter à nouveau.

Considérez cette classe très rugueuse et simple avec SimpleXML:

class BlogPost
{
    var $date;
    var $ts;
    var $link;

    var $title;
    var $text;
}

class BlogFeed
{
    var $posts = array();

    function __construct($file_or_url)
    {
        $file_or_url = $this->resolveFile($file_or_url);
        if (!($x = simplexml_load_file($file_or_url)))
            return;

        foreach ($x->channel->item as $item)
        {
            $post = new BlogPost();
            $post->date  = (string) $item->pubDate;
            $post->ts    = strtotime($item->pubDate);
            $post->link  = (string) $item->link;
            $post->title = (string) $item->title;
            $post->text  = (string) $item->description;

            // Create summary as a shortened body and remove images, 
            // extraneous line breaks, etc.
            $post->summary = $this->summarizeText($post->text);

            $this->posts[] = $post;
        }
    }

    private function resolveFile($file_or_url) {
        if (!preg_match('|^https?:|', $file_or_url))
            $feed_uri = $_SERVER['DOCUMENT_ROOT'] .'/shared/xml/'. $file_or_url;
        else
            $feed_uri = $file_or_url;

        return $feed_uri;
    }

    private function summarizeText($summary) {
        $summary = strip_tags($summary);

        // Truncate summary line to 100 characters
        $max_len = 100;
        if (strlen($summary) > $max_len)
            $summary = substr($summary, 0, $max_len) . '...';

        return $summary;
    }
}
164
Brian Cline

Avec 4 lignes, j'importe un flux RSS dans un tableau.

$feed = implode(file('http://yourdomains.com/feed.rss'));
$xml = simplexml_load_string($feed);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

Pour une solution plus complexe

$feed = new DOMDocument();
 $feed->load('file.rss');
 $json = array();
 $json['title'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
 $json['description'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('description')->item(0)->firstChild->nodeValue;
 $json['link'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('link')->item(0)->firstChild->nodeValue;
 $items = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('item');

 $json['item'] = array();
 $i = 0;

 foreach($items as $key => $item) {
 $title = $item->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
 $description = $item->getElementsByTagName('description')->item(0)->firstChild->nodeValue;
 $pubDate = $item->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue;
 $guid = $item->getElementsByTagName('guid')->item(0)->firstChild->nodeValue;

 $json['item'][$key]['title'] = $title;
 $json['item'][$key]['description'] = $description;
 $json['item'][$key]['pubdate'] = $pubDate;
 $json['item'][$key]['guid'] = $guid; 
 }

echo json_encode($json);
38
PJunior

Je voudrais introduire un script simple pour analyser RSS:

$i = 0; // counter
$url = "http://www.banki.ru/xml/news.rss"; // url to parse
$rss = simplexml_load_file($url); // XML parser

// RSS items loop

print '<h2><img style="vertical-align: middle;" src="'.$rss->channel->image->url.'" /> '.$rss->channel->title.'</h2>'; // channel title + img with src

foreach($rss->channel->item as $item) {
if ($i < 10) { // parse only 10 items
    print '<a href="'.$item->link.'">'.$item->title.'</a><br />';
}

$i++;
}
17
Vladimir Lukyanov

Si le flux n'est pas un XML bien formé, vous êtes censé le rejeter, sans exception. Vous avez le droit d'appeler le créateur de flux n bozo .

Sinon, vous êtes en train de paver la voie pour bousiller ce code HTML.

12
Kornel

La bibliothèque HTML Tidy est capable de réparer certains fichiers XML mal formés. Exécuter vos flux avant de les transmettre à l'analyseur peut aider.

6
ceejayoz

J'utilise SimplePie pour analyser un flux Google Reader et cela fonctionne plutôt bien et offre un ensemble de fonctionnalités décent.

Bien sûr, je ne l'ai pas testé avec des fils RSS/Atom) mal formés, donc je ne sais pas comment cela se passe, je suppose que Google est assez conforme aux normes! :)

2
user7094

Personnellement, j'utilise BNC Advanced Feed Parser - j'aime le système de gabarit très facile à utiliser

1
Adam

Le PHP lecteur RSS - http://www.scriptol.com/rss/rss-reader.php - est un analyseur complet mais simple utilisé par des milliers d'utilisateurs ...

1
Thinol