Textdatei auslesen und formatiert anzeigen


leuktra

Mitglied
Hallo zusammen!

Folgende Frage: Ich habe eine Textdatei die sich so "gliedert":

Überschrift (A)
Text, Text ...
Text, Text ...
<Leerzeile>
Überschrift (B)
Text, Text ...
<Leerzeile>
Überschrift (C)
Text, Text ...
Text, Text ...
Text, Text ...
<Leerzeile>
usw.

Nun würde ich die Textdatei gern per PHP so ausgeben lassen, daß
die Überschriften immer Fett und die Texte immer z.B. in Arial
angezeigt werden. Wie eine Textdatei per PHP aufgerufen wird weiß
ich - wie löst man aber das mit der "Formatierungsabfrage"?
 

Iches

Erfahrenes Mitglied
Ich denke du wirst die Überschriften wahrscheinlich bestimmt gekennzeichnet haben oder? Weil suchst du einfach danach mit preg_match und wenn ja, dann setzt du vor und nach der Ausgabe deine Formatierung.
 

Layna

Erfahrenes Mitglied
Hallo.
Ich nehme mal an dass du die Datei als HTML ausgeben willst?
Zum Korrekten erkennen und umsetzen der Zeilenumbrüche, sonderzeichen etc. gibt es, soweit ich mich erinnere, eine Funktion... aber bevor ich die finde haben sich die gurus hier 5 bis 6 mal dran erinnert wie die hiess ^^.
Zu den Überschriften:
Wenn die alle etwas gemeinsam haben dass die anderen Zeilen NICHT haben (eben z.B. dein (*) am ende) kannst du die per regular expression erkennen und dann ein <h1> drum herum setzen.

Layna
 

leuktra

Mitglied
Hallo.
Ich nehme mal an dass du die Datei als HTML ausgeben willst?
Zum Korrekten erkennen und umsetzen der Zeilenumbrüche, sonderzeichen etc. gibt es, soweit ich mich erinnere, eine Funktion... aber bevor ich die finde haben sich die gurus hier 5 bis 6 mal dran erinnert wie die hiess ^^.
Zu den Überschriften:
Wenn die alle etwas gemeinsam haben dass die anderen Zeilen NICHT haben (eben z.B. dein (*) am ende) kannst du die per regular expression erkennen und dann ein <h1> drum herum setzen.

Layna
Hi Layna,
danke für Deine Antwort ... das weiß ich! :)
 

leuktra

Mitglied
Ich denke du wirst die Überschriften wahrscheinlich bestimmt gekennzeichnet haben oder? Weil suchst du einfach danach mit preg_match und wenn ja, dann setzt du vor und nach der Ausgabe deine Formatierung.
Nein, ich habe die Überschriften usw. nicht gekennzeichnet! Habe eben leider noch gar keine Idee :(
 

Iches

Erfahrenes Mitglied
Das Problem ist nämlich dann, dass man nicht genau weiß wo eine Überschrift ist, und wo der normale Text anfängt.
 

leuktra

Mitglied
Nun habe ich das so gemacht:

PHP:
<?php
$datei = fopen('blabla.txt', 'r');
if ($datei)
{
while (!feof($datei)) 
{
$inhalt = fgets($datei);
$daten = explode(" | ", $inhalt);
echo '<b>'.htmlentities($daten[0]).'</b>';
echo '<i>'.htmlentities($daten[1]).'</i>';
}
fclose($datei);
}
else
echo 'Datei nicht gefunden!';
?>
Für Verbesserungsvorschläge wäre ich sehr dankbar!
 

Michael Engel

Erfahrenes Mitglied
Wenn die Datei weiter so unformatiert ist gibt es nur 2 Regeln:

  • 1. Zeile ist immer eine Überschrift
  • Nach jeder Freizeile Kommt eine Überschrift

Dann könnte man es auch so lösen:

PHP:
$head = false;
$bold = true;
$file = explode("\n", file_get_contents('datei.bla'));
foreach ($file as $row){
    if($row == "") $head = true;
    echo ($bold?'<b>':'').$row.($bold?'</b>':'').'<br>';
    if($head) {
        $bold = true;
        $head = false;
    } else {
        $bold = false;
    }
}
 
Zuletzt bearbeitet:

leuktra

Mitglied
Wenn die Datei weiter so unformatiert ist gibt es nur 2 Regeln:

  • 1. Zeile ist immer eine Überschrift
  • Nach jeder Freizeile Kommt eine Überschrift

Dann könnte man es auch so lösen:

PHP:
$head = false;
$bold = true;
$file = explode("\n", file_get_contents('datei.bla'));
foreach ($file as $row){
    if($row == "") $head = true;
    echo ($bold?'<b>':'').$row.($bold?'</b>':'').'<br>';
    if($head) {
        $bold = true;
        $head = false;
    } else {
        $bold = false;
    }
}
Danke für diese Lösungsvariante! :)

Folgende Sache ist dabei aufgetreten: Die erste Überschrift wurde korrekt (Fett) ausgegeben; alle anderen dann nicht mehr! :confused:
 

Michael Engel

Erfahrenes Mitglied
Er erkennt leere Zeilen. Falls auch Leerzeichen oder so darin vorkommen können mach noch ein trim() beim vergleich:

PHP:
    if(trim($row) == "") $head = true;
 

leuktra

Mitglied
Hallo Engelb,

danke für Deine Hilfe :) Mit "trim" funktioniert es supi!

Nun habe ich noch folgende Sachen:

1.) Der ausgegebene Text soll noch mit htmlentities "formatiert"
werden. Leider weiß ich nicht, wie bzw. wo ich das einfügen soll?

2.) Die Überschriften werden korrekt "Fett" ausgegeben; jedoch möchte
ich die Textteile unter jeder Überschrift "Kursiv" formatieren. Ist
das so korrekt, wie ich das umgesetzt habe?

3.) Am Ende der gesamten Ausgabe soll dann ("Unterschrichen"):
"Verfaßt am:..." stehen. Ist das so korrekt, wie ich das umgesetzt habe?

Für Deine Hilfe wäre ich sehr dankbar.

PHP:
$head = false;
$bold = true;
$file = explode("\n", file_get_contents('bla.txt'));
foreach ($file as $row)
{
if(trim($row) == "") $head = true;
echo ($bold?'<b>':'').$row.($bold?'</b><br><i>':'').'';
if($head)
{
echo '</i>';
$bold = true;
$head = false;
}
else
{
$bold = false;
}
}
echo '</i><u>Verfaßt am: ...</u>';
 

Michael Engel

Erfahrenes Mitglied
Ansonsten wenn es so aussieht wie du wolltest sieht du ja schnell ob es so richtig ist ,)

PHP:
echo ($bold?'<b>':'').htmlentities($row).($bold?'</b><br><i>':'').'';
 

Prominenter

Grünschnabel
Hi@all
ich weiß, das hier ist schon etwas älter, aber es hat mir sehr geholfen auch min Vorhaben entsprechend umzusetzen - danke dafür.
Ich hoffe trotzdem, das dieser Thread nochmal aufgenommen wird, denn ich habe noch eine Frage zum Script.

Wie bekomme ich es hin das er eine Überschrift erst als Überschrift erkennt wenn ZWEI Leerzeilen vor einer Überschrift sind ???
Code:
Das ist die erste Überschrift
Leerzeile
Das ist normaler Text
Das ist normaler Text
Das ist normaler Text
Leerzeile
Das ist normaler Text
Das ist normaler Text
Das ist normaler Text
Leerzeile
Leerzeile
Das ist eine weitere Überschrift
Leerzeile
Das ist normaler Text
Das ist normaler Text
Das ist normaler Text
Leerzeile
Das ist normaler Text
Das ist normaler Text
Das ist normaler Text
usw.
PHP:
...
$leerzeile = 0;
...
foreach
...
if(trim($row) == "") $leerzeile++;
if($leerzeile == 2) { $head = true; $leerzeile=0;}
...
… aber irgendwie komme ich damit nicht zum gewünschten Ergebnis.
Wäre echt nett von Euch, wenn da mal jemand drüber schauen könnte und mir einen entsprechenden Tipp geben kann.

Ich hoffe , ich habe mich verständlich ausgedrückt
Thx@all
 

Sempervivum

Erfahrenes Mitglied
Dies sollte tun, was Du brauchst:
Code:
function getHeader($row)
{
    return ('<h1>' . $row . '</h1>');
}
$text = file('thread344-format-text.txt', FILE_IGNORE_NEW_LINES);
echo getHeader($text[0]);
$empty = 0;
for ($i = 1; $i < count($text); $i++) {
    $row = $text[$i];
    if (trim($row) == '') {
        $empty++;
    } else {
        if ($empty >= 2) {
            echo getHeader($row);
        } else {
            echo ('<p>' . $row . '</p>');
        }
        $empty = 0;
    }
}
Je nach Semantik kannst Du natürlich auch etwas anderes als ein <p> nehmen, eine Klasse hinzu fügen etc.
 
Zuletzt bearbeitet:

Prominenter

Grünschnabel
Hi@all

na das ging ja fix - suuuper, vielen herzlichen Dank.
Allerdings habe ich nun das Problem, dass mir keine Zeilenumbrüche und keine Leerzeilen mit angezeigt werden, der gesamte Text wird als Block ausgegeben.

Die Leerzeilen soll er natürlich auch ausgeben, damit man die Textabsätze erkennt.

Und was bewirkt : FILE_IGNORE_NEW_LINES

Thx@all
 
Zuletzt bearbeitet:

Sempervivum

Erfahrenes Mitglied
Die Leerzeilen kannst Du beibehalten, indem Du z. B. ein <br> einfügst, so:
PHP:
function getHeader($row)
{
    return ('<h1>' . $row . '</h1>');
}
$text = file('thread344-format-text.txt', FILE_IGNORE_NEW_LINES);
echo getHeader($text[0]);
$empty = 0;
for ($i = 1; $i < count($text); $i++) {
    $row = $text[$i];
    if (trim($row) == '') {
        echo '<br>';
        $empty++;
    } else {
        if ($empty >= 2) {
            echo getHeader($row);
        } else {
            echo ('<p>' . $row . '</p>');
        }
        $empty = 0;
    }
}
Zeilenumbrüche sollten eigentlich erhalten bleiben, da ich pro Zeile ein Absatzelement verwendet habe (<p>). Falls Du etwas anderes meinst, beschreibe es genauer und poste vielleicht etwas originalen Test (wenn er nicht vertraulich ist).

Und was bewirkt : FILE_IGNORE_NEW_LINES
Das kannst Du hier nachlesen: