phpbar.de logo

Mailinglisten-Archive

[php] Ist das so OK?

[php] Ist das so OK?

Frank Rasche phpml at raschesweb.de
Fre Aug 29 19:14:45 CEST 2003


Hallo Alexander,

Alexander Palm schrieb am Donnerstag, 28. August 2003 um 00:20:

> Habe ein wenig mit RegEx rumgespielt und wie bei Heise angeboten den
> NewsTicker ausgelesen.

> Es funktioniert auch - wollte nur mal ne Expertenmeinung hören ob ich es
> einigermaßen "sauber" gelößt habe?

Ja, einigermassen ;-)

Ich weiss zwar nicht, was du hören willst; der Code funktioniert ja,
wie du sagst.
Wie in anderer Mail schon erkannt, schreit .rdf förmlich danach via
XML geparst zu werden. Wie ebenfalls bemerkt, bedeutet das sicher
ein wenig mehr Code, aber zu Übungszwecken wäre das ein guter
Anfang, oder?
IMHO wäre das auch eine "sauberere" Lösung.
Ob sich das real für die paar Zeilen von Heise lohnt, steht auf
einem anderem Blatt.

Zu deinem Code:
ab php 4.3.x kannst du statt file(), file_get_contents() benutzen,
dann sparst du dir das implode des Arrays, das dir file()
zurückliefert.

Wenn du ausserdem Code sparen willst, dann kannst du auf den den
ersten RegExp verzichten und gleich preg_match_all verwenden.

preg_match_all ("'<title>(.*?)</title>.*?<link>(.*?)</link>'si",$in_file, $matches);

ich habe hier ein paar Klammern weggelassen.

>
>         echo "<h2>".$matches[2]." <font size=\"-3\"><a
> href=\"".$matches[4]."\" target=\"_blank\">(c) by HEISE</font></h2>\n";

<pedant>
du hast vergessen den <a href> mit </a> zu schliessen.
</pedant>

Ausserdem würde ich mir angewöhnen statt " gleich einfache ' zu
verwenden.

sehr ordentlich schauts aus, wenn du
printf ('<h2>%s</h2> <font size="-3"><a href="%s" target="_blank">(c) by HEISE</a></font></h2>'.chr(13),$matches[1][0],$matches[2][0]);

schreibst.

Etwas schneller gehts bei
echo '<h2>'.$matches[1][0].'<font size="-3">... usw.';

>         preg_match_all
> ("'<item>.*?(<title>(.*?)</title>).*?(<link>(.*?)</link>).*?</item>'si",
> $in_file, $matches);

siehe oben, ganz so viele Klammer brauchst du nicht.
Raus kommt dabei ein Array

matches[0] = array(... kompletter pattern )
matches[1] = array(... titel...)
matches[2] = array(... link ... )


>
>         for ($i=0; $i < count($matches[0]); $i++){
>                 echo "<li><a href=\"".$matches[4][$i]."\"
target=\"_blank\">".$matches[2][$i]."</a></li>\n";
>         }

Hier ebenfalls besser ' verwenden statt ", dann musst du nicht jeden
" escapen.
Da ausserdem die Werte $matches[1][0] und $matches[2][0] für die
Überschrift reserviert sind, fängst du mit 1 an zu zählen:

for ($i = 1;...)

Mehr fällt mir nicht dazu ein.

Gruss
Frank


php::bar PHP Wiki   -   Listenarchive