RSS Feed auslesen - Probleme

klausi89

Erfahrenes Mitglied
Hallo ich habe mal eine Frage und zwar lese ich von cointelegraph einen RSS Feed aus mit folgendem Code

PHP:
<?php
if( !$xml = simplexml_load_file('https://de.cointelegraph.com/rss/tag/bitcoin') ) {
    die('Error - can´t reading the XML file!');
}

$out = array();
$i = 1;         // Anzahl Datensätze

if( !isset($xml->channel[0]->item) ) {
    die('No Items found! ');
}

foreach($xml->channel[0]->item as $item) {
    if( $i-- == 0 ) {
        break;
    }

    $out[] = array(
        'title'        => (string) $item->title,
        'description'  => (string) $item->description,
        'link'         => (string) $item->guid,
        'date'         => date('d.m.Y', strtotime((string) $item->pubDate))
    );
}

$re = '/\<IMG[\s\S]*?SRC\=\"([^\"]+\.jpg)\"/mi';
$str = $item->description;
preg_match($re, $str, $matches);

foreach ($out as $value) {
    echo '<div class="card">';
    echo '<img class="card-img-top img-fluid" src="'. $matches[1] .'" alt="Bitcoin News">';
    echo '<div class="card-body">';
    echo '<h6 class="card-title">'. $value['date'] .'</h6>';
    echo '<hr>';
    echo '<p class="card-text">'. $value['title'] .'</p>';
    echo '<a href="#" class="btn btn-primary"><i class="fab fa-readme"></i> mehr...</a>';
    echo '</div>';
    echo '</div>';
}

  ?>

leider habe ich folgende Probleme das Bild passt nicht zum Beitrag sondern ist scheinbar vom vorherigen. Außerdem hab ich festgestellt wenn ich 2 oder mehrere
Einträge anzeigen lasse haben dann alle das gleiche Bild.

Weiß da vielleicht jemand woran das liegen könnte bzw. was ich falsch gemacht habe.

Desweiteren wie kann man die $item->description zerlegen in den normalen Text und die darin enthaltene Image url.
Außerdem würde ich gerne wissen ob man den ausgelesenen Feed in z.Bsp. einer Cache htm ablegen kann und den erst nach beispielsweise 30 minuten erneuern kann um ladezeiten zu sparen also das nicht bei jedem Seitenaufruf der Feed abgefragt wird. Falls das gehen sollte würde ich gerne wissen wie.

Danke schon mal im voraus.
 
Zuletzt bearbeitet von einem Moderator:

Sempervivum

Erfahrenes Mitglied
leider habe ich folgende Probleme das Bild passt nicht zum Beitrag sondern ist scheinbar vom vorherigen. Außerdem hab ich festgestellt wenn ich 2 oder mehrere
Einträge anzeigen lasse haben dann alle das gleiche Bild.
Ohne es getestet zu haben: Was Du beschreibst, ist genau das, was mit diesem Skript programmiert ist, dieses:
Code:
$re = '/\<IMG[\s\S]*?SRC\=\"([^\"]+\.jpg)\"/mi';
$str = $item->description;
preg_match($re, $str, $matches);
liegt außerhalb der foreach-Schleife, daher bekommst Du immer das Bild aus dem item nach dem item, das zuletzt in der Schleife bearbeitet wurde.
Nimm diesen Code mit in die Schleife hinein und alles ist gut.
Außerdem würde ich gerne wissen ob man den ausgelesenen Feed in z.Bsp. einer Cache htm ablegen kann und den erst nach beispielsweise 30 minuten erneuern kann um ladezeiten zu sparen also das nicht bei jedem Seitenaufruf der Feed abgefragt wird.
Das geht auf jeden Fall und es gibt zwei Wege:
  1. Selber programmieren. Mit PHP kannst Du das HTML in eine Cachedatei schreiben. Dann ermittelst Du bei jedem Aufruf den Zeitpunkt der letzten Änderung und prüfst, ob die max. Zeit verstrichen ist. Wenn nein, lieferst Du das HTML aus der Datei aus, wenn ja liest Du den Feed neu und speicherst ihn wieder in der Datei.
  2. Es gibt vorgefertigte Feedreader, die ein Caching eingebaut haben. Die ich kenne sind leider veraltet, versuche, selbst einen zu finden, der aktuell ist und Caching unterstützt.
 

klausi89

Erfahrenes Mitglied
ok danke schon mal hab die 3 Zeilen mit in die foreach schleife getan und bei einem artikel wird dann das richtige bild angezeigt...wenn ich aber 2 oder mehr artikel einlesen lasse sind dann wieder bei allen die gleichen bilder .

Nach so einem reader suche ich schon seit mehreren tagen leider vergebens....
 

Sempervivum

Erfahrenes Mitglied
Meine Beschreibung war nicht ganz vollständig, Du musst nicht nur den Code mit der Regex verschieben, sondern das Ergebnis auch in das Array eintragen und von dort wieder auslesen:
Code:
foreach($xml->channel[0]->item as $item) {
    if( $i-- == 0 ) {
        break;
    }
    $re = '/\<IMG[\s\S]*?SRC\=\"([^\"]+\.jpg)\"/mi';
    $str = $item->description;
    preg_match($re, $str, $matches);
    $out[] = array(
        'title'        => (string) $item->title,
        'description'  => (string) $item->description,
        'link'         => (string) $item->guid,
        'date'         => date('d.m.Y', strtotime((string) $item->pubDate)),
        'imgsrc'       => matches[1]
    );
}

// und dann bei der Generierung des HTML aus dem Array lesen
(ungetestet)
 

klausi89

Erfahrenes Mitglied
das ging ja fix.....gehe ich recht in der annahme das ich das image dann mit

$value['imgsrc'] aufrufen sollte...wenn ja dann geht es irgendwie auch nicht
 

Sempervivum

Erfahrenes Mitglied
Eigentlich schon, aber wie geschrieben, ich habe es nicht getestet. Was heißt denn, es geht nicht, wieder ein falsches Bild oder jetzt gar keins?
 

klausi89

Erfahrenes Mitglied
Top...danke hab es auch gerade gesehen ....jetzt funktioniert es wie gewünscht ich danke dir für die schnelle Hilfe. Das mit dem caching muss ich mir noch in ruhe anschauen.

Danke sehr nochmal
 

klausi89

Erfahrenes Mitglied
Morgen darf ich nochmal stören, also erstmal zu dem dg/rss das hab ich mir angeschaut und leider sind da wieder keine Bilder mit in deren Abfrage und der Einbau ist mir leider zu kompliziert da ich nicht so das php ass bin.

Ich habe jetzt mal folgende Variante ausprobiert:

PHP:
<?php


  // Feed-URL des RSS-Feeds

$feed_url = 'https://de.cointelegraph.com/rss/tag/bitcoin';


// In welcher Datei soll der Cache abgelegt werden?

$feedcache_path = __DIR__.'/feed_cache.html';


// Wie alt in Sekunden darf der Cache sein?

$feedcache_max_age = 200;


if(!file_exists($feedcache_path) or filemtime($feedcache_path) < (time() - $feedcache_max_age)) {

  $xml = simplexml_load_string(file_get_contents($feed_url));


$out = array();

$i = 1;         // Anzahl Datensätze

if( !isset($xml->channel[0]->item) ) {

    die('No Items found! ');

}


foreach($xml->channel[0]->item as $item) {

    if( $i-- == 0 ) {

        break;

    }

    $re = '/\<IMG[\s\S]*?SRC\=\"([^\"]+\.jpg)\"/mi';

    $str = $item->description;

    preg_match($re, $str, $matches);

    $out[] = array(

        'title'        => (string) $item->title,

        'description'  => (string) $item->description,

        'link'         => (string) $item->guid,

        'date'         => date('d.m.Y', strtotime((string) $item->pubDate)),

        'imgsrc'       => $matches[1]

    );

}


foreach ($out as $value) {


               $output .=  '<div class="card">';

               $output .=  '<img class="card-img-top img-fluid" src="'. $value['imgsrc'] .'" alt="News">';

               $output .=  '<div class="card-body">';

               $output .=  '<h6 class="card-title">'. $value['date'] .'</h6>';

               $output .=  '<hr>';

               $output .=  '<p class="card-text">'. $value['title'] .'</p>';

               $output .=  '<a href="#" class="btn btn-primary"><i class="fab fa-readme"></i> mehr...</a>';

               $output .=  '</div>';

               $output .=  '</div>';


}


echo $output;

  file_put_contents($feedcache_path, $output);

} else {

  echo file_get_contents($feedcache_path);

}

  ?>

Die Datei feed_cache.html wird zumindest schonmal erfolgreich erstellt und der Code dort erfolgreich hineingeschrieben. Leider wird aber wohl die abfrage nach den angegebenen Sekunden scheinbar nicht erneuert.
Meine Frage dazu wie genau könnte ich testen bis zu welchem Punkt der Code funktioniert bzw. ist mein Lösungsansatz überhaupt richtig so.

Leider weiß ich jetzt nicht so recht warum die Abfrage nicht nach den hier voreingestellten 200 sekunden neu ausgeführt wird.

vielleicht könntest du da mal drüber schauen.