GB-Einträge aus HTML-Datei auslesen (RegEx!)

ludz

Erfahrenes Mitglied
Folgender Sachverhalt:
Eine der Seiten, die ich sozusagen betreue, bedient sich eines kostenlos gestellen Gästbuches von einem Gratis-Anbieter im Internet (activebook.de).
Jetzt will ich das Ganze allerdings durch ein selbst geschriebenes ersetzen, aber die alten Einträge nicht verlieren.
Ich habe jetzt alle Seiten des Gästebuchs im HTML-Format hier vorliegen und wüsste jetzt gern eine Möglichkeit, wie ich die Einträge auslesen kann, um dann anschließend die einzelnen Elemente in Variablen speichern zu können (Beispiel Name in $name, Nachricht in $msg etc.).
Ich habe zwar schon viel mit explode() etc. versucht, aber das Ergebnis ist nicht ganz zufriedenstellend, weil es viele Einträge "zerhackstückelt".
Deshalb dachte ich an Funktionen, die mit RegEx arbeiten. Allerdings kenne ich mich damit überhaupt nicht aus, deshalb wär ich für Hilfe sehr dankbar!

Ein Eintrag im HTML-Format sieht so aus:
Code:
<table width="100%" border="0">
    <tr> 
      <td bgcolor="#FFFFFF"><font color="#000000" size="1" face="Verdana, Arial, Helvetica, sans-serif"><b>Name 
        </b>schrieb am 05. July 2003, 15:10 Uhr <a href="mailto:E-Mail-Adresse"><img border="0" src="skins/skin1/email.gif"></a> 
        <a href="http://www.die-webseite.de" target="_blank"><img border="0" src="skins/skin1/home.gif"></a> 
        </font><br> 
        <table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#3A73C9">
          <tr> 
            <td><font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-serif">Nachricht
              <font color="#C9E5FF"><i></i></font></font></td>
          </tr>
        </table></td>
    </tr>
  </table>
  <font size="1" face="Verdana, Arial, Helvetica, sans-serif"><br>
  </font> 
<!-- Hier kommen dann weitere Einträge, gleiches FOrmat... //-->
<!-- Die Variablen/Elemente wären von oben nach unten (fett hervorgehoben!): $name, $datum, $email, $www, $msg //-->

Wie kann man denn jetzt nach den einzelnen Elementen der Einträge suchen, bzw. erstmal die Einträge an sich "isolieren" und dann die jeweiligen Elemente suchen und in Vars speichern?
 
Hallo, ich bin nicht gerade der Held, wenn es um reguläre Ausdrücke geht, aber folgendes funktioniert (tested):
PHP:
  ereg('sans-serif"><b>(.*)</b>schrieb am (.*) <a href="mailto:(.*)"><img(.*)<a href="(.*)" target="_blank"><img(.*)sans-serif">(.*)<font color="#C9E5FF"><i></i></font></font></td>', $str, $ar);
  
  $name  = $ar[1];
  $datum = $ar[2];
  $email = $ar[3];
  $www   = $ar[5];
  $msg   = $ar[7];

In $str muss die Seite enthalten sein.

Gruß, snuu
 
Vielen Dank!
Das funktioniert im Grunde genommen schon, nur leider ist das Skript mehr als langsam und dementsprechend überschreitet es stets die max. Ausführungszeit und bricht dann ab.
Das liegt zum einen wahrschienlich an der Funktion ereg(), zum anderen aber bestimmt auch an den Dateien an sich, denn die beherbergen ja schon ca. 15 Einträge und ca. 300 Zeilen HTML-Code.
Und ist es normal, dass ereg() immer nur den ersten Treffer ausgibt (oder den letzten?!), also zumindest immer nur einen?
Gibts ne Möglichkeit alle Treffer auszugeben / zu speichern?
Im MOment lade ich die Datei nämlich jeweils mit file() zeilenweise in eine Variable und wende dann ereg() darauf an, Problem siehe oben.

Habt ihr Ideen, wie ich das Ganze sonst noch realisieren / verbessern kann?
 
fügst du das array dann auch noch zu einer variablen zusammen?
außerdem sollte, soweit ich weiß, wenn möglich preg-funktionen und nicht ereg-funktionen verwendet werden (schneller).


probier's mal so
PHP:
$pattern = '/sans-serif"><b>(.*)</b>schrieb am (.*) <a href="mailto<img src="images/smilies/frown.gif" border="0" alt="">.*)"><img(.*)<a href="(.*)" target="_blank"><img(.*)sans-serif">(.*)<font color="#C9E5FF"><i></i></font></font></td>/i';
preg_match_all($pattern,$str,$ar);
for ($i=0;$i<count($ar[1]);$i++) {
  $beitraege[$i]["name"] = $ar[1][$i+1];
  $beitraege[$i]["datum"] = $ar[2][$i+1];
  $beitraege[$i]["email"] = $ar[3][$i+1];
  $beitraege[$i]["www"] = $ar[5][$i+1];
  $beitraege[$i]["msg"] = $ar[7][$i+1];
}

is nich getestet und bestimmt voller fehler :D

bei der schleife ist das mit $i<count($ar[1]) nur ne vermutung, keine ahnung ob es funnktioniert.
ansonsten wäre noch möglich $i<anzahlDerBeiträge zu nehmen.
 
Dass der Scriptabbruch verhindert wird, erreichst Du mit
PHP:
set_time_limit(0);
Mein Code geht davon aus, dass Du jeweils aus dem Codeschnipsel die Daten auslist, wie Du ihn gepostet hast.

snuu
 
Danke für die Antworten, wir sind auf dem richtigen Weg... :-)

allerdings funktioniert das Ganze immer noch nicht, die Variablen $beitraege... nehmen einfach keine Werte an (wird nichts gefunden???).
Argh... ich hock schon ewig lang an dem Kram und hab schon Gott weiß was versucht...
Vielleicht hat ja jmd. doch noch einen Geistesblitz oder kommt dem Fehlerteufel auf die SChliche...
 
PHP:
$file = file("test.html");
for ($i=0;$i<count($file);$i++) {
    $file[$i] = trim($file[$i]);
}
$file = implode("",$file);
$pattern =  '|<table [^>]*><tr><td [^>]*><font [^>]*><b>(.*)</b>schrieb am (.*) <a href\="mailto:(.*)"><img [^>]*></a><a href\="(.*)" [^>]*><img [^>]*></a></font><br><table [^>]*><tr><td><font [^>]*>(.*)<font [^>]*><i></i></font></font></td></tr></table></td></tr></table><font [^>]*><br></font>|siU';
preg_match_all($pattern,$file,$matches,PREG_SET_ORDER);
for ($i=0;$i<count($matches);$i++) {
  $beitr[$i]["name"] = $matches[$i][1];
  $beitr[$i]["datum"] = $matches[$i][2];
  $beitr[$i]["email"] = $matches[$i][3];
  $beitr[$i]["www"] = $matches[$i][4];
  $beitr[$i]["msg"] = $matches[$i][5];
}

das hat jetzt, so wie es ist, bei mir funktioniert.
und zeitlich sollte es nu auch keine probleme mehr geben.
 
Zuletzt bearbeitet:
@SepteraCore: Saugeil, es klappt! Wie gern würd ich dir jetzt ein virtuelles Bier ausgeben :-)
Vielen Dank nochmal, natürlich auch an dich snuu!

Man, man, man, ich müsste mir wirklich mal die ganzen RegEx Sachen zu Gemüte führen. So kanns net weitergehen... ;-)
 
Zurück