YouBookmarks Blog: [PHP] Prosty czytnik RSS (czytnik rss na stronę)
    [PHP] Prosty czytnik RSS (czytnik rss na stronę)
    Hej, przeglądając statystyki serwisu, często spotykam się ze słowami kluczowymi: czytnik, rss, php na jakie to trafiacie tu z wyszukiwarek. Chcąc zaspokoić Wasze potrzeby oraz żeby spędzony na stronie czas nie poszedł na marne zaserwuje Wam dziś prostą klasę czytnika RSS na stronę www razem z przykładem wykorzystania, którą napisałem kiedyś na potrzeby jednego z zaprzyjaźnionych for.

    Oto ona:

    <?
    class Readfeed
    {

    // Otwiera plik kanału RSS
    function otworz_kanal_rss($kanalrss
    {
    set_time_limit(30);
    $licz 0;
    $openrss fopen($kanalrss,"r") or die(print "Nie mozna otworzyć adresu URL:$kanalrss  / ERROR 404"); 
    while (!
    feof($openrss)) 
        {
        
    $licz++;
        
    $danerss .= fgets($openrss);
        if(
    $licz>1500) {break;}    
        }
        
    $danerss str_replace("&apos;"," ",$danerss);
        
    $danerss str_replace("&copy;"," ",$danerss);
        
    $danerss str_replace("<![CDATA[","",$danerss);
        
    $danerss str_replace("]]>","",$danerss);
        return 
    $danerss;
    }

    // Przygotuj dane do tablicy
    function przygotuj_tablice($danerss)
    {
    $tag "item ";
    $danerss =  preg_replace("/<" $tag "(.|\s)*?>/","<item>",$danerss);
    $danerss chop($danerss);   
    $danerss ereg_replace("[\r\n]""<br/> "$danerss); 
    $danerss str_replace("\r\n""<br/> "$danerss);
    $danerss str_replace("\r""<br/> "$danerss);
    $danerss strstr($danerss,"<item>"); 
    $tags_strip = Array("");
    foreach (
    $tags_strip as $tag
    {
    $danerss preg_replace("/<" $tag ">(.|\s)*?<\/+" $tag ">/","",$danerss);
    }
    $danerss str_replace("<item>",""$danerss); 
    $danerss urldecode($danerss); 
    $danerss str_replace(strstr("</channel>",$danerss),"",$danerss);
    return 
    $danerss;
    }

    // Tworzymy tablice
    function tworz_tablice($danerssok)
    {
    $danerssok explode("</item>",$danerssok); 
    return 
    $danerssok;
    }

    // Walidacja tablicy
    function waliduj_tablice($tablicarss$liczba)
    {
    $tytul = array();
    $link = array();
    $opis = array();
    $tab = array();
    $pubDate = array();

    $x 0;
    while(
    $x $liczba
        
        {
        
    $link[$x] = strstr($tablicarss[$x],"<link>"); 
        
    $link[$x] = ereg_replace("<link>","",$link[$x]); 
        
    $link[$x] = str_replace(strstr($link[$x],"</link>"),"",$link[$x]);
         
    $link[$x] = trim($link[$x]);
        
    $link[$x] = str_replace(" ","+",$link[$x]);

        
    $tytul[$x] = strstr($tablicarss[$x],"<title>");
        
    $tytul[$x] = ereg_replace("<title>","",$tytul[$x]);
        
    $tytul[$x] = str_replace(strstr($tytul[$x],"</title>"),"",$tytul[$x]); 
          
    $tytul[$x] = trim($tytul[$x]);
          
    $tytul[$x] = ereg_replace('"'''$tytul[$x]);
        
    $tytul[$x] = ereg_replace("'"""$tytul[$x]);
        
    $tytul[$x] = strip_tags($tytul[$x]);
        
        
    $pubDate[$x] = str_replace("<br />","<br />",$tablicarss[$x]);
        
    $pubDate[$x] = str_replace("</pubdate>","</pubDate>",$pubDate[$x]);
        
    $pubDate[$x] = strstr($pubDate[$x],"<br />"); 
        
    $pubDate[$x] = ereg_replace("<br />","",$pubDate[$x]); 
        
    $pubDate[$x] = str_replace(strstr($pubDate[$x],"</pubDate>"),"",$pubDate[$x]);
         
          
    $opis[$x] = strstr($tablicarss[$x],"<description>");
        
    $opis[$x] = ereg_replace("<description>","",$opis[$x]);
          
    $opis[$x] = str_replace(strstr($opis[$x],"</description>"),"",$opis[$x]);
          
    $opis[$x] = trim($opis[$x]);
          
    $opis[$x] = ereg_replace('"'''$opis[$x]);
        
    $opis[$x] = ereg_replace("'"""$opis[$x]);
        
    $opis[$x] = str_replace("&lt;","<",$opis[$x]);
        
    $opis[$x] = str_replace("&gt;",">",$opis[$x]);
        
    $opis[$x] = strip_tags($opis[$x], '<br/>');
            
        
    $tab[$x]["link"]=$link[$x];
        
    $tab[$x]["opis"]=$opis[$x];
        
    $tab[$x]["tytul"]=$tytul[$x];
        
    $tab[$x]["pubDate"]=$pubDate[$x];

           if (
    $tytul == "") { $liczba $x; break; } 
                  
           
    $x++;
           }
    return 
    $tab;
    }

    // zapis kanału do sessji
    function zapis_do_sessji($tab$liczba$rssmd5)
    {
    $item = array();
    $x=0;

    while (
    $x $liczba
     { 

    $link =  $tab[$x][link];
    $tytul $tab[$x][tytul];
    $opis $tab[$x][opis];
    $pubDate =  $tab[$x][pubDate];

    $link str_replace("&amp;","&",$link);
    $link str_replace('"',"",$link);
    $link str_replace(' ',"",$link);
    $link str_replace(' ',"",$link);

    $tytul str_replace("&amp;","&",$tytul);
    $tytul str_replace("<![CDATA[","",$tytul);
    $tytul str_replace("]]>","",$tytul);

    $opis str_replace("&amp;","&",$opis);
    $opis str_replace("&lt;br /&gt;","<br/>",$opis);
    $opis str_replace("&lt;br&gt;","<br/>",$opis);

    if (
    $tytul == "") { break; } 

    $item[$x]["item"] = $x;
    $item[$x]["title"] = $tytul;
    $item[$x]["opis"] = $opis;
    $item[$x]["link"] = $link;
    $item[$x]["pubDate"] = $pubDate;

    $x++;

    }
    $_SESSION[$rssmd5] = $item;
    return 
    $x;
    }

    function 
    GetFeedToSession($kanalrss,$liczba,$rssmd5)
    {
    $danerss $this->otworz_kanal_rss($kanalrss);
    $danerss $this->przygotuj_tablice($danerss);
    $tablicarss $this->tworz_tablice($danerss);
    $tab $this->waliduj_tablice($tablicarss$liczba);
    return 
    $this->zapis_do_sessji($tab$liczba$rssmd5);
    }

    function 
    DispalyFeed($rssmd5,$liczba)
    {
    $item $_SESSION[$rssmd5];
    $y 0;
    while (
    $y $liczba)

    if(
    $item[$y][title]=="") {break;}
    $dane .= "<div class=\"tematy\"><a href=\"javascript:ap('include/feed_msg.php?item=$y&rss=".$rssmd5."','info$y');\">".$item[$y][title]."</a></div><div id=\"info$y\"></div>";
    $y++;
    }
    if(
    $y == 0) {unset ($_SESSION[$rssmd5]);}
    return 
    $dane;
    }

    }
    ?>
    Sama klasa nie jest zbytnio przydatna dlatego odsyłam Was do przykładu poniżej , w którym znajdziecie brakujące części układanki.

    Zasada działania:

    skrypt pobiera zawartość RSS'a zapisując go do sesji jako tablicę wielowymiarową, następnie z tablicy pobierane są tytuły rekordów i wyświetlane jako odpowiednio spreparowane linki, tak aby po kliknięciu pobrać przez AJAX'a z tablicy wielowymiarowej zapisanej w sesji pozostałe informacje dotyczące wybranego niusa.

    Życzę miłej zabawy i zapraszam do komentowania
    Share

    Subscribe RSS (blog) 15486 views Comments (13) Jun 06, 2007 13:11

    Mar 08, 2009 0:52 sqor (Guest)
    Czytnik jest świetny! Wszystko działa znakomicie!
    Mam tylko jeden mały nietypowy problem... Potrzebował bym go uprościć w taki sposób aby wyświetlać mógł tylko jeden kanał RSS i robił to automatycznie (bez potrzeby kliknięcia "wczytaj") i żeby od razu pod każdym tytułem wczytywały się fragmenty artykułów (a nie tak jak teraz że trzeba kliknąć na tytuł aby wyświetlił się pod spodem fragment). Bardzo liczył bym na pomoc.
    Mar 09, 2009 0:52 PiotrekJ
    Wystarczy zastąpić w pliku index.php


    <?

    //wiersz 7

    $feed $_POST['feed'];



    //wiersz 34

    if($_POST['feed']!="")

    ?>


    danymi


    <?

    //wiersz 7

    $feed "http://adres_URL_feeda";



    //wiersz 34

    if($feed!="")

    ?>


    oraz zahaszować linijkę
    //include "include/kanaly.php";
    Mar 12, 2009 9:52 Pawel (Guest)
    A co zrobić aby od razu były wczytane fragmenty artykułów?
    Mar 12, 2009 10:41 PiotrekJ
    można w metodzie DispalyFeed zastąpić linię
    $dane .= "<div class=\"tematy\"><a href=\"javascript:ap('include/feed_msg.php?item=$y&rss=".$rssmd5."','info$y');\">".$item[$y][title]."</a></div><div id=\"info$y\"></div>"; 

    linijką
    $dane .= '<div class="tematy"><a href="'.$item[$y]['link'].'">'.$item[$y]['title'].'</a></div><div>'.$item[$y]['opis'].'</div>'; 


    nie testowałem daj znać czy działa
    Nov 07, 2009 10:36 Tomasz007
    Witam - mam pytanie - jak moge zmienic wielkosc, rozmiar czcionki itp. w w tematach w index.php ?
    Nov 07, 2009 12:34 PiotrekJ
    Wygląd czytnika można dopasować edytując plik /style/style.css - wystarczy podstawowa znajomość CSS-a. Zainteresuj się parametrem font oraz font-size
    http://4programmers.net/CSS/Font-size
    Nov 07, 2009 17:09 Tomasz007
    Zgadza sie ale z tego co zdążyłem zauważyć plik style.css tyczy sie feed_msg czyli opisu w ramce pod tematem a chcialbym zmienic wyglad czcionek samych tematów - z tego co widze to temat jest wyswietlany z indexu.php w linijce:

    echo $obj->DispalyFeed($rssmd5,$liczba);


    tylko jak tutaj zmienic czcionkę, krój, kolor itp ???

    Pozdrawiam
    Jan 14, 2010 8:49 Acech
    Co zrobić by czytnik pobierał grafiki z żródła RSS ??
    Jan 17, 2010 10:28 PiotrekJ
    w metodzie waliduj_tablice() w lini
    $opis[$x] = strip_tags($opis[$x], '<br/>');

    możesz dopisać znaczniki HTML, które funkcja strip_tags() ma przepuszczać, np:
    $opis[$x] = strip_tags($opis[$x], '<br/>,<img>,<b>,<u>,<i>');
    Jul 25, 2010 16:48 mariio81
    Nie wiem co źle zrobiłem ale wgrałem na serwer ten czytnik ustawiłem prawa dostępu i po wczytaniu strony wszystko jest ok ale po wybraniu kanału i kliknięciu wczytaj wyświetla że nie można otworzyć adresu. W czytniku nic nie zmieniałem jest w oryginale tak jak napisałeś.
    Jul 28, 2010 22:03 PiotrekJ
    Podaj link do skryptu i adres kanału, którego nie chce wczytać :)
    Aug 20, 2010 19:20 mariio81
    Nic nie wczytuje, a w pliku include/kanaly.inc.php są linki które wklejam do przeglądarki i wyświetla treści a tutaj nic pusta strona.
    Mar 31, 2012 13:46 PiotrekJ
    Masz problem z serwerem i sesjami

    Sign in to add a comment


    Don’t have a Youbookmarks account yet?
    Sign Up Now
    Unregistered
    Sign in
    Don’t have a Youbookmarks account yet?
    Sign Up Now

    YB Developer Blog
    Add-ons