25 stycznia 2004 (niedziela), 20:49:49
Programować każdy może...
Programować każdy może, to znaczy, że mogę ja też. A więc chcąc sobie zrobić spis treści moich notek zagłębiłem się w XML-a, programowanie w PHP-ie, wyrażenia regularne... Myślę, że każdy, nawet niepraktykujący informatyk powinien raz na 5 lat, tak dla sportu rozwiązać jakiś fajny problem przy pomocy wyrażeń regularnych.
Efekty (okropne) można oglądać tu:
A kod, który to robi jest poniżej. Szkoda tylko, że nie robi tego co chciałem, czyli nie wyciąga mi spisów notek z archiwum. Ale tak to zawsze jest z projektami informatycznymi: założenia są jakieś a wychodzi coś innego, o czym przekonujemy się obserwując jak Softbank robi CEPIK.
Ale ja mam korzyści z tej zabawy: dowiedziałem się czegoś o XML-u, o parsowaniu, przypomniałem sobie PHP-a (od czasów stworzenia FIKI zapomniałem wiele), potrenowałem ereg_replace, liznąłem UTF-8 i Unicode... Trening mózgu zaliczony!
/******************************************************************
To prosty program, ktory pobiera pierwsza strone bloga z blog.pl
jako RSS w formacie XML i rozbiera ja na elementy pierwsze
korzystajac ze standardowego parseta dostepnego w PHP4.
Programowac kazdy moze !
Program w piekna styczniowa 2004 roku noc popelnil W34.
*******************************************************************/
$ItemOn = 0; // wskaznik, czy analizuje opis bloga czy notke
$LinkOn = 0; $TitleOn = 0; $DateOn = 0; $DescriptionOn = 0;
$SpisNotek1 = array(); // tablica, w ktorej skompletuje spis tresci
$xSpisNotek1 = 0; // indeks do budowania tablicy notek
$TytulBloga = "";
// najlepiej zrobic to tak aby nikomu nie wpadlo do
// glowy otwieranie /etc/shadow
$blog = $_SERVER[QUERY_STRING];
$file = "http://" . $blog . ".blog.pl/index.rss";
wyswietl_tematy_notek ($file);
function wyswietl_tematy_notek ($blog_rss_url) {
global $SpisNotek1, $TytulBloga;
# na poczatek parsowanie tego XML-a co sie go wczytuje
$xml_parser = xml_parser_create ();
xml_set_element_handler ($xml_parser, "startElement", "endElement");
xml_set_character_data_handler ($xml_parser, "characterData");
if (!($fp = fopen ($blog_rss_url, "r")))
die ("cos ta strona w XML nie chce sie otworzyc");
while ($data = fread ($fp, 4096)) {
if (!xml_parse ($xml_parser, $data, feof ($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string (xml_get_error_code ($xml_parser)),
xml_get_current_line_number ($xml_parser)));
}
}
xml_parser_free ($xml_parser);
# a teraz wyrzucenie spisu notek w jakims formacie
echo '<b>' . $TytulBloga . '</B></BR>';
foreach ($SpisNotek1 as $notka) {
echo '<P>';
echo '<a href="' . $notka [link] . '" target="nw">';
echo '' . $notka [title] . '</A>';
echo '<small>' . $notka [date] . '</small>';
# echo '' . $notka [description]; // cos to brzydko wyglada
# echo '<HR>';
}
}
#
# funkja wolana przez parser w chwili, gdy znajdzie on emelemt otwierajacy
#
function startElement($parser, $name, $attrs) {
global $LinkOn, $ItemOn, $TitleOn, $DateOn, $DescriptionOn;
switch ($name) {
case "ITEM" : // notki sa umieszczone w
$ItemOn++;
break;
case "LINK" :
$LinkOn++;
break;
case "TITLE" :
$TitleOn++;
break;
case "DC:DATE" :
$DateOn++;
break;
case "DESCRIPTION" :
$DescriptionOn++;
break;
}
}
#
# funkja wolana przez parser w chwili, gdy znajdzie on zamkniecie
#
function endElement($parser, $name) {
global $LinkOn, $ItemOn, $TitleOn, $DateOn, $DescriptionOn;
global $xSpisNotek1;
switch ($name) {
case "ITEM" :
$ItemOn--;
$xSpisNotek1++;
break;
case "LINK" :
$LinkOn--;
break;
case "TITLE" :
$TitleOn--;
break;
case "DC:DATE" :
$DateOn--;
break;
case "DESCRIPTION" :
$DescriptionOn--;
break;
}
}
#
# funkcja wolana przez parser, gdy ma on dane zawarte w elemencie
#
function characterData ($parser, $data) {
global $LinkOn, $ItemOn, $TitleOn, $DateOn, $DescriptionOn;
global $SpisNotek1, $xSpisNotek1, $TytulBloga;
if ($ItemOn){
if ($LinkOn)
$SpisNotek1 [$xSpisNotek1] [link] = $data;
if ($TitleOn)
$SpisNotek1 [$xSpisNotek1] [title] = utf82iso88592 ($data);
if ($DateOn)
// na pewno mozna ta date potraktowac lepiej :-)
$SpisNotek1 [$xSpisNotek1] [date] = substr ($data, 0, 10);
# if ($DescriptionOn) // cos te konwersje tekstu nie dzialaja :-)
# $SpisNotek1 [$xSpisNotek1] [description] = utf82iso88592 (html2text ($data));
} else
if ($TitleOn)
$TytulBloga = utf82iso88592 ($data);
}
?>
Komentarze: (2)
> Programować każdy może, to znaczy, że mogę ja też.
No, teraz przynajmniej wiadomo dlaczego jordan przestal dzialac... ;)
> Myślę, że każdy, nawet niepraktykujący informatyk powinien raz na 5 lat, tak dla sportu rozwiązać jakiś fajny problem przy pomocy wyrażeń regularnych.
Nam na studiach kazali to robic na kartce - teraz zrozumialem dlaczego....
Skomentuj notkę