# Textdatei auslesen und formatiert anzeigen



## leuktra (12. Juli 2007)

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 (12. Juli 2007)

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 (12. Juli 2007)

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 (12. Juli 2007)

Layna hat gesagt.:


> 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:
> ...



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


----------



## leuktra (12. Juli 2007)

Iches hat gesagt.:


> 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 (12. Juli 2007)

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


----------



## leuktra (12. Juli 2007)

Iches hat gesagt.:


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



Genau, ich habe auch schon überall geschaut aber leider keinen Lösungsansatz gefunden!


----------



## leuktra (13. Juli 2007)

Nun habe ich das so gemacht:


```
<?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 (13. Juli 2007)

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:


```
$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;
    }
}
```


----------



## DeeJTwoK (13. Juli 2007)

```
}
```
sorry konnte nicht anders


----------



## Michael Engel (13. Juli 2007)

Huch da haben sogar 2 Gefehlt :>

doofes Copy&Paste ^^


----------



## leuktra (15. Juli 2007)

engelb hat gesagt.:


> Wenn die Datei weiter so unformatiert ist gibt es nur 2 Regeln:
> 
> 
> 1. Zeile ist immer eine Überschrift
> ...



Danke für diese Lösungsvariante!  

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


----------



## Michael Engel (16. Juli 2007)

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


```
if(trim($row) == "") $head = true;
```


----------



## leuktra (17. Juli 2007)

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.


```
$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 (17. Juli 2007)

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


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


----------



## leuktra (17. Juli 2007)

Danke! Super! 

Da habe ich mal wieder den Wald vor Bäumen nicht gesehen!


----------



## Prominenter (26. März 2020)

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 ???

```
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.
```


```
...
$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 (26. März 2020)

Dies sollte tun, was Du brauchst:

```
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.


----------



## Prominenter (27. März 2020)

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


----------



## Sempervivum (27. März 2020)

Die Leerzeilen kannst Du beibehalten, indem Du z. B. ein <br> einfügst, so:

```
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:
https://www.php.net/manual/de/function.file.php


----------



## Prominenter (27. März 2020)

Hi@all

Danke, das mit

```
...
if (trim($row) == '') {
        echo '<br>';
...
```
 hat geholfen.

Thx@all


----------



## ComFreek (27. März 2020)

Der Code, den @Sempervivum auf der letzten Threadseite gezeigt hat, sollte besser htmlspecialchars beinhalten bei der Ausgabe. Nicht für XSS-Angriffe, sondern einfach für Korrektheit. Was, wenn die Textdatei spitze Klammern verwenden möchte?


----------



## Prominenter (27. März 2020)

ComFreek hat gesagt.:


> Der Code, den @Sempervivum auf der letzten Threadseite gezeigt hat, sollte besser htmlspecialchars beinhalten bei der Ausgabe. Nicht für XSS-Angriffe, sondern einfach für Korrektheit. Was, wenn die Textdatei spitze Klammern verwenden möchte?



Ok, schön, an welcher Stelle ???


----------



## ComFreek (27. März 2020)

Sempervivum hat gesagt.:


> ```
> return ('<h1>' . $row . '</h1>');
> echo ('<p>' . $row . '</p>');
> ```


Hier statt $row `htmlspecialchars($row, ENT_HTML5)` (ich hoffe du nutzt HTML5).


----------

