Leerzeilen löschen mit reg-ex nach Bedingung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Zeilen formatieren mit RegEx oder anders.



    Ich möchte alle Dateien in einem Ordner für die weitere Verwendung formatieren.
    Die Dateien sind bzg. der Leerzeilen einheitlich vorformatiert.

    Istzustand :
    127. Titel Text (Text) (Text)


    Originaltext Text Text
    Deutscher Text Text Text
    Originaltext Text Text
    Deutscher Text Text Text
    Originaltext Text Text
    Deutscher Text Text Text
    Originaltext Text Text
    Deutscher Text Text Text

    Originaltext Text Text
    Deutscher Text Text Text
    Originaltext Text Text
    Deutscher Text Text Text
    Originaltext Text Text
    Deutscher Text Text Text
    Originaltext Text Text
    Deutscher Text Text Text

    Originaltext Text Text
    Deutscher Text Text Text
    Originaltext Text Text
    Deutscher Text Text Text
    Originaltext Text Text
    Deutscher Text Text Text
    Sollzustand :
    <h1>127. Titel Text</h1><br />
    <em>(Text) (Text)</em><dl>


    <dt>Originaltext Text Text</dt>
    <dd>Deutscher Text Text Text</dd>
    <dt>Originaltext Text Text</dt>
    <dd>Deutscher Text Text Text</dd>
    <dt>Originaltext Text Text</dt>
    <dd>Deutscher Text Text Text</dd>
    <dt>Originaltext Text Text</dt>
    <dd>Deutscher Text Text Text</dd></dl><dl>

    <dt>Originaltext Text Text</dt>
    <dd>Deutscher Text Text Text</dd>
    <dt>Originaltext Text Text</dt>
    <dd>Deutscher Text Text Text</dd>
    <dt>Originaltext Text Text</dt>
    <dd>Deutscher Text Text Text</dd>
    <dt>Originaltext Text Text</dt>
    <dd>Deutscher Text Text Text</dd></dl><dl>

    <dt>Originaltext Text Text</dt>
    <dd>Deutscher Text Text Text</dd>
    <dt>Originaltext Text Text</dt>
    <dd>Deutscher Text Text Text</dd>
    <dt>Originaltext Text Text</dt>
    <dd>Deutscher Text Text Text</dd></dl>
    Wie zu sehen, soll die erste Zeile, die mit einer Zahl beginnen muß
    und damit als Titel identifiziert ist, als h1 Zeile deklariert werden
    mit der anschließenden Eröffnung einer <dl> .

    Wenn nach dem Titeltext noch Text in ()rn kommt, soll dieser mit <br />
    von der h1 Zeile getrennt werden und in <em></em> gesetzt werden.

    Wie in allen anderen Zeilen auch sollen alle mehrfachen Leerzeichen
    ersetzt und alle eventuellen Punkte. am Ende der Zeile entfernt werden.

    Die anschließenden Zeilen sollen abwechselnd mit <dt></dt> und <dd></dd>
    umschlossen werden. Wenn der deutsche Text noch nicht da ist, soll
    <dd></dd> eingefügt werden.

    Am Ende einer jeden Strophe soll mit </dl> geschlossen und mit <dl>
    eine neue eröffnet werden.

    Bei der letzten Strophe braucht natürlich nur mit </dl> geschlossen
    werden.

    Die Abstände der dl werden über css definiert.

    Soweit die Aufgabenstellung.

    Regeln:

    Wenn Titelzeile ohne () dann <h1>Titelzeile Text</h1><dl>

    Wenn Titelzeile mit () dann:
    <h1>Titelzeile Text</h1>
    <em>(Text) (Text)</em><dl>

    Erster Treffer einer Strophenzeile und alle weiteren Strophenzeilennummern
    + 2 solange, bis + 2 eine Leerzeile, nähmlich die Trennzeile zwischen
    den Strophen trifft; all diese Zeilen sollen mit <dt></dt> umschlossen
    werden.

    Die jeweils nächste dieser Trefferzeilen soll mit <dd></dd> umschlossen
    werden, außer der letzten, wenn nachher noch Text, also eine nächste
    Strophe, kommt.
    Diese letzte Strophenzeile soll also so <dd>Text</dd></dl><dl> formatiert werden.
    Wenn kein Text mehr kommt, haben wir die letzte Zeile im Dokument;
    diese soll mit <dd>Text</dd></dl> umschlossen sein.

    Mein erster Lösungsansatz:

    PHP-Code:
    $dir "phptest/";

    if (
    is_dir($dir)) { 
        if (
    $dh opendir($dir)) {
            while ((
    $file readdir($dh)) !== false) { 
                if(
    $file != "." && $file != "..") { 
                    
    $file_line file$dir.$file);
                    
    $zz count$file_line);
                    foreach( 
    $file_line as $key => $line) { 
                        if( 
    $key == 0) {                    # Titelzeile formatieren
                            
    $line '<h1>'.$line;
                            
    $line str_replace("\n""</h1><dl>\n"$line);
                            
    $line preg_replace('/\s\s+/'' '$line);
                            echo 
    $line;
                        } 
                        if( 
    $key && $key $zz) {        # nächste Zeilen auswählen
                            
    if( preg_match'/^\s/'$line)) {# Leerzeile gefunden
                                
    echo "<br>";
                            }
                            if( 
    preg_match'/\S/'$line)) {# Erste Strophenzeile gefunden
                                
                                
    if( bcmod($key,'2') == ) {# gerade Zeilennumer Deutsch
                                    
    echo "Deutsch $line";
                                } 
                                else {                        
    # ungerade Zeilennummer Original
                                    
    echo "Original $line";
                                }
                            } 
                        }
                    }
                }
            }
        }
            
    closedir($dh);

    Dieser Ansatz verfolgt die Umsetzung der minimalen Anforderungen.

    Leider habe ich ja durch die eine Leerzeile zwischen den Strophen
    wechselnde Eigenschaften der Zeilennummern, so das der Zugriff so
    nicht funktioniert. Habe schon versucht, einen Umschalter einzubauen,
    habe aber keine Stelle gefunden, an dem ich Ihn hätte einbauen können.
    Ich kann natürlich im Schritt vorher zwei Zeilen als Strophentrennung
    einstellen, dann würde der Zugriff funktionieren.
    Da ich aber nicht nur fummeln, sondern etwas lernen möchte, würde mich
    ein Lösungsvorschlag interessieren.


    Da ich eine blasse Ahnung von RegEx im vorherigen Beitrag erlangt habe,
    denke ich, das auch hier RegEx einen anderen Zugriff ermöglicht. Dabei
    ging es darum, Zeichengruppen im RegEx zu definieren, die später mittels
    einer Abfrage fallspezifisch ersetzt werden.

    Wir haben also grundsätzlich 4 Zeilenarten:

    1. Titelzeile, eventuell mit Klammern, ist immer die erste Zeile
    2. Leerzeilen als Element-trenner, die nicht bearbeitet werden brauchen
    3. Originaltext
    4. Eventuell deutscher Text unter dem Originaltext

    Wie ich das jetzt in einem regulären Ausdruck unterbringen soll, ist
    mir leider noch ein Rätsel.

    Kann jemand weiterhelfen?

    Gruß

    Estrela
    Denk positiv.

    Kommentar


    • #17
      Immer noch gleiche Baustelle -> *zusammenführ*
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #18
        Zitat von Estrela Beitrag anzeigen
        Wir haben also grundsätzlich 4 Zeilenarten:

        1. Titelzeile, eventuell mit Klammern, ist immer die erste Zeile
        2. Leerzeilen als Element-trenner, die nicht bearbeitet werden brauchen
        3. Originaltext
        4. Eventuell deutscher Text unter dem Originaltext
        Woher weißt du, ob deutscher Text existiert? Warum willst du immer mit RegEx lösen? Bist du z.Z. RegEx-*eil oder was?

        Kommentar


        • #19
          Hallo asp2php.

          Grundsätzlich bin ich an einer Lösung der Aufgabe interessiert. Ich finde einfach die Möglichkeiten von RegEx gut und möchte da was dazulernen.
          Ist halt nur nicht so einfach, aus einer Vorlage viele Fälle abstrakt abzuleiten.
          Der deutsche Text steht da, wenn er da ist. Soll heißen, er kann, muß aber nicht vorhanden sein.

          Gruß

          Estrela
          Denk positiv.

          Kommentar


          • #20
            Zitat von Estrela Beitrag anzeigen
            Der deutsche Text steht da, wenn er da ist. Soll heißen, er kann, muß aber nicht vorhanden sein.
            ... und wie unterscheidet er sich vom englischen Text? Sagt nicht dass du 'ne Texterkennungsoftware in PHP geschrieben hast, der das beim Einlesen automatisch erkennt!

            Kommentar


            • #21
              Hallo asp2php.

              Nein, natürlich nicht.
              Ich bekomme die Originaltexte und übersetze sie. Jetzt soll aber das Script so flexibel sein, auch noch nicht übersetzte Texte zu formatieren.
              Die einzige Erkennung, abgesehen von den Sonderzeichen der brasilianischen Sprache( die in einer Zeile auftauchen können, aber nicht müssen ), ist die, das der deutsche Text eine Zeile unter der originalen Sprache steht, bzw. stehen soll und per css farblich zurückgenommen gestalltet wird.

              Gruß

              Estrela
              Denk positiv.

              Kommentar


              • #22
                Zitat von Estrela Beitrag anzeigen
                ... das der deutsche Text eine Zeile unter der originalen Sprache steht, bzw. stehen soll und per css farblich zurückgenommen gestalltet wird.
                Toll! Und du meinst PHP "sieht" das? Solange du nicht irgendwas machst, damit PHP das "sieht" kannst du erstmal vergessen, denn wie soll man ein Algorithmus aufstellen, wobei Entscheidungskriterien überhaupt nicht da sind.

                Kommentar


                • #23
                  Hallo asp2php.

                  Wieso ist kein Kriterium da?.

                  Die erste Textzeile nach dem Titel ist der Originaltext.
                  In der nächsten Zeile ist entweder Text oder nicht. Auf jeden Fall soll mit <dd></dd> umschlossen werden.
                  Solange, bis die Strophentrennung erkennbar wird.
                  Dann ist die erste Zeile der Strophe wieder der Originaltext.
                  Das war ja auch der Ansatz meines ersten Lösungsvorschlags orientiert an den Zeilennummern. Leider wechseln diese ja in jeder Strophe durch die eine Leerzeile( wenn deutscher Text da ist) ihr Vorzeichen( gerade Zeilennummer, ungerade Zn), so das der Zugriff so nicht funktioniert.

                  Gruß

                  Estrela
                  Denk positiv.

                  Kommentar


                  • #24
                    Ah, jetzt verstehe ich, d.h. wenn keine Übersetzung da ist, bleibt die Zeile leer, richtig? Und wo ist das Problem? Die Tags drum rum zu bauen? Ist nicht wahr, oder? Wenn du schon geschafft hast, Leerzeilen dazwischen zu bauen, warum nicht mit der gleichen Vorgehensweise die Tags einzubauen?

                    Kommentar

                    Lädt...
                    X