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 :
Sollzustand :
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:
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
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
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
<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>
<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>
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 > 1 && $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') == 0 ) {# gerade Zeilennumer Deutsch
echo "Deutsch $line";
}
else { # ungerade Zeilennummer Original
echo "Original $line";
}
}
}
}
}
}
}
closedir($dh);
}
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
Kommentar