Andreas Korthaus: unperformanter regulärer Ausdruck

Beitrag lesen

Hallo!

Ich wollte mich gerade nochmal an meine Self-Archiv Datenbank wagen, und bei der Gelegenheit wollte ich nochmal alles neu parsen, um an Stelle der einzelnen Threads einzelne Postings pro Datensatz in die DB zu schreiben. Naja, hierzu habe ich jetzt einen Regulären Ausdruck geschreieben, der auf meinem Computer über 10.000 Dateien mit über 100.000 Postings parsen muß. Da sollte das ganze schon etwas performanter sein. Ich habe das jetzt wie folgt gemacht:

/*Beispielhaftes Posting:

<h2 class="sh2"><a class="an" name="m138412">(JAVA) Signierte Applets - Systemauslastung</a></h2>  <p>Die folgende Nachricht zum Thema stammt von:  <b>Axel Richter</b>,  <img src="/src/xgmail.gif" width="15" height="10" border="0" alt="E-Mail" /> <a href="mailto:axel.richter@ragbildung.de"><b>axel.richter@ragbildung.de</b></a>,  01. Oktober 2002, 10:59 Uhr  </p>  <p><tt>
*/

$pattern = "/<h2.*?><a.*?name="m([0-9]+)">((.*?)) (.*?)</a></h2>.*?<b>(.*?)</b>.*?([0-9]{2}). (\w+) ([0-9]{4}), ([0-9]{2}):([0-9]{2}) Uhr(.*?)<tt>(.*?)</tt>/";

preg_match_all($pattern,$string,$matches,PREG_SET_ORDER);

Ihr kennt die Daten ggfs. etwas besser als ich, komme ich mit dem Ausdruck für das 2002er Archiv klar, oder bekomme ich irgendwo Probleme? Bei Tests hat es funktioniert, halt nur etwas langsam.  Ich verwende ja immer .*?, ist glaube ich nicht so toll, aber ich weiß nicht was ich an Stelle dessen schreiben soll!

Und nochwas, ein weiterer Punkt den ich optimieren könnte, ich öffen die Dateien wie folgt:

$data = file($file);
$string = implode("",$data);

Das war mal eben das einfachste, oder sollte ich unter Performance-Gesichtspunkten eher fopen() bevorzugen?

Viele Grüße
andreas