EisFuX: regular expressions

Ich habe eine längere Liste von Zitaten, schön in HTML formatiert. Die möchte ich nun in eine Datenbank importieren. Da ich zu faul bin, die Zitateinträge einzeln zu übernehmen, wollte ich mir ein PHP-Skript schreiben, dass diese Aufgabe übernimmt. So weit, so gut.

Leider hat sich nun das "Ausfiltern" der Nutzinformationen aus dem HTML-Wirrwarr als Problem herausgestellt. Die einzelnen Zitate sind nämlich nicht immer exakt gleich aufgebaut. Ich habe mal die vier möglichen Varianten aufgeführt:

...

Zitattext.<br />
  <i class="author">Autor</i><br /><br />

<!--kommentar-->
  Zitattext.<br />
  <i class="author">Autor</i><br />

Zitattext.<br />
  <i class="author">Autor</i><br /><br />
  <small>(Anmerkungstext)</small><br /><br />

<!--kommentar-->
  Zitattext.<br />
  <i class="author">Autor</i><br /><br />
  <small>(Anmerkungstext)</small><br /><br />

...

Erschwerend kommt hinzu, dass manche Zitate mehrere Zeilen in der Art
Zitattext<br />
Zitattext.<br />
enthalten.
Weitere HTML-Tags treten aber nicht auf.

"Kommentar", "Autor" und "Anmerkung" herauszufiltern ist dabei das kleinere Übel. Aber der Zitattext selbst weigert sich beharrlich. Ich weiß nicht, wie ich den Anfang des Textes mit regulären Ausdrücken definieren soll.

Außerdem hat mich die schiere Fülle von RegEx-Funktionen in PHP etwas überrascht (habe bisher nur Perl benutzt), daher habe ich meine ersten Versuche auf die Funktion
preg_match()
beschränkt.

Kann mir jemand helfen oder Tipps geben?
(Aber bitte keine Links zu PHP-Hilfe-Websites, die kenne ich schon alle -- inklusive "selfphp.de" und "de.php.net/manual/de/ref.pcre.php")

  1. Hallo EisFuX!

    Leider hat sich nun das "Ausfiltern" der Nutzinformationen aus dem HTML-Wirrwarr als Problem herausgestellt. Die einzelnen Zitate sind nämlich nicht immer exakt gleich aufgebaut. Ich habe mal die vier möglichen Varianten aufgeführt:

    [...]

    Zitattext.<br />
      <i class="author">Autor</i><br /><br />

    <!--kommentar-->
      Zitattext.<br />
      <i class="author">Autor</i><br />

    Zitattext.<br />
      <i class="author">Autor</i><br /><br />
      <small>(Anmerkungstext)</small><br /><br />

    <!--kommentar-->
      Zitattext.<br />
      <i class="author">Autor</i><br /><br />
      <small>(Anmerkungstext)</small><br /><br />

    Das einzige Muster bzgl. "Zitattext", das ich hier sehe wäre die ein/zwei oder drei Zeilen vor <i class="author"> zu nehmen.
    Einen anderen Anhaltspunkt hast Du ja leider nicht.

    Die Zitate, die mit <!--kommentar--> beginnen sollten ja auch kein größeres Problem darstellen.
    Zieh doch erstmal die raus. Dann wird Deine Zitatdatei vermutlich schon um einiges kleiner.
    Danach kannst Du ja schauen, wie Du die restlichen rausfiltern kannst.

    MfG
    Götz

    --
    Losung für Sonntag, 28. November 2004
    Die Israeliten sprachen zum Herrn: Wir haben gesündigt, mache du es mit uns, wie dir's gefällt; nur errette uns heute! (Richter 10,15)
    Der Engel sprach zu Maria: Siehe, du wirst schwanger werden und einen Sohn gebären, und du sollst ihm den Namen Jesus geben. Der wird groß sein und Sohn des Höchsten genannt werden; und Gott der Herr wird ihm den Thron seines Vaters David geben. (Lukas 1,30-32)
    (Losungslink)
    1. Hallo Götz!

      Das einzige Muster bzgl. "Zitattext", das ich hier sehe wäre die ein/zwei oder drei Zeilen vor <i class="author"> zu nehmen.
      Einen anderen Anhaltspunkt hast Du ja leider nicht.

      Genau das war ja mein Problem: Kein definierter Anfang, sieht man einmal davon ab, dass jede Zeile mit zwei Leerzeichen beginnt.

      Zieh doch erstmal die raus. Dann wird Deine Zitatdatei vermutlich schon um einiges kleiner.
      Danach kannst Du ja schauen, wie Du die restlichen rausfiltern kannst.

      Der FuX ist schlau und stellt sich dumm, bei mir ist's leider andersrum.

      Auf die Idee bin ich noch gar nicht gekommen: Die komplizierten Zitate zuerst rausfiltern und danach die einfachen.

  2. Hallo!

    ...

    Zitattext.<br />
      <i class="author">Autor</i><br /><br />

    <!--kommentar-->
      Zitattext.<br />
      <i class="author">Autor</i><br />

    Zitattext.<br />
      <i class="author">Autor</i><br /><br />
      <small>(Anmerkungstext)</small><br /><br />

    <!--kommentar-->
      Zitattext.<br />
      <i class="author">Autor</i><br /><br />
      <small>(Anmerkungstext)</small><br /><br />

    ...

    Vorausgesetzt, daß das Zitat immer folgendes Format hat:

    <i class="author">Autor</i><br /><br />
    <small>(Anmerkungstext)</small><br /><br />

    <?PHP

    $htmlzitate = '  Zitattext.<br />
      <i class="author">Lisa</i><br /><br />
      <small>Lisa-Zitat</small><br /><br />

    <!--kommentar-->
      Zitattext.<br />
      <i class="author">Peter</i><br /><br />
      <small>Peter-Zitat</small><br /><br />';

    function print_var($var)
     {
      echo "<pre>";
      print_r($var);
      echo "</pre>";
     }

    function zitat($string)
     {
      preg_match("/<i class="author">(.*)</i>/", $string, $author);
      $zitat['author'] = htmlspecialchars($author[1]);
      preg_match("/<small>(.*)</small>/", $string, $text);
      $zitat['text'] = htmlspecialchars($text[1]);
      return $zitat;
     }

    preg_match_all("/(<i class="author">(.*?)</small>)/is", $htmlzitate, $match);

    for($i = 0; $i < sizeof($match[1]); $i++)
     {
      //print_var(htmlspecialchars($match[1][$i]));
      $zitatliste[] = zitat($match[1][$i]);
     }

    print_var($zitatliste);

    ?>

    MfG, André Laugks

    --
    L-Andre @ gmx.de
    1. Da war ich zu schnell.

      Vorausgesetzt, daß das Zitat immer folgendes Format hat:

      <i class="author">Autor</i><br /><br />
      <small>(Anmerkungstext)</small><br /><br />

      Ich meine:

      <i class="author"> [...] </small>

      Ich hole mir von jedem Zitat "<i class="author">...</small>". Dann nehme ich aus diesem String "<i class="author">Autor</i>" den Author und aus "<small>(Anmerkungstext)</small>" den Anmekungstext.

      MfG, André Laugks

      --
      L-Andre @ gmx.de
    2. Hallo André,

      es freut mich, dass ich gleich komplette Quelltexte geliefert bekomme. Werde das Skript bei Gelegenheit ausprobieren.

      Außerdem habe ich Mist geschrieben, ich habe vor allem mit der Funktion
      preg_match_all()
      gespielt. Die liefert so schöne Listen (Arrays?), wenn denn die regulären Ausdrücke was sinnvolles gefunden haben.

      --

      Übrigens:
      Ich hab mir gerade
      http://balkonblumenzauber.pb82.de/
      angeschaut. Wird langsam Zeit, dass mal jemand ein Duft-Plugin für Web-Browser entwickelt :).