Hallo Michael,
das Thema hatten wir schon mal vor laaange Zeit. Damals habe ich Die sogar extra ein paar Beispiele gebaut. Die hast Du aber scheinbar nicht berücksichtigt.
Wenn Du Daten über ein Zeilen-Textfeld oder eine Textbox (Textarea) gemeinsam in einem Ascii-Datensatz abspeichern willst, musst Du Dir erstmal Gedanken über das Speicherformat machen. Du brauchst (mindestens) zwei Sonderzeichen, die NICHT in den Daten enthalten sein dürfen:
1. Feldtrenner: hierfür empfehle ich chr(4)
2. Zeilenendezeichen: hierfür ist festgelegt CRLF für WIN-DOS, bzw. bei LF Speicherung auf UNIX oder CR für MAC-Systeme.
define ("CRLF",chr(13).chr(10)); // und für die anderen auch
define ("SEP",chr(4)); // Feldtrenner nicht vergessen
define ("ZU",chr(127)); // für den Zeilenumbruch
3. Wenn ein abzuspeichernder Text selber Zeilenumbrüche enthalten soll, dann muss man die ebenfalls mit einem Sonderzeichen geltend machen. Hierfür empfehle ich chr(127).
Alle drei Sonderzeichen stehen für diese Zwecke zur Verfügung und werden für nichts anderes benötigt. Außerdem liegen sie alle im Bereich 0-127, was für die Datenübertragung per HTTP sinnvoll sein kann.
Wenn ein Text aus einer Textbox beim PHP-Script ankommt, kann er
1. Zeilenumbrüche (CRLF) enthalten
2. HTML-Code enthalten
3. evtl. den Feldtrenner enthalten (das ist unwahrscheinlich aber nicht unmöglich)
Du musst also
1. Die "echten" Zeilenumbrüche in eigene (des Speicherformates) umwandeln
hierzu benutzt Du:
$textfeld=str_replace(CRLF,chr(127),$textfeld);
$textfeld=str_replace(CR,chr(127),$textfeld);
$textfeld=str_replace(LF,chr(127),$textfeld);
Bitte alle drei Ersetzungen in dieser Reihenfolge durchführen.
2. Nach unerlaubten Feldtrenner-Zeichen suchen und diese entfernen:
$textfeld=str_replace(SEP,"",$textfeld);
Dann kannst Du die Daten bereits zu einem Datensatz zusammenstellen:
$datensatz=$feld1.SEP.$feld2.SEP.$textfeld.SEP.$letztesFeld.LF;
Anschließend kannst Du den Datensatz mit
...
fwrite($fh,$datensatz,strlen($datensatz));
...
In die Datei schreiben.
Das wiederauslesen der Daten geht dann ganz einfach mit:
$datei=file("dateiname");
In jeder Zelle des indizierten Arrays steht jetzt ein Datensatz.
$datensatz=explode(SEP,substr($datei,0,-1));
Nun ist $datensatz ein Array, in dem die einzelnen Felder wieder zugänglich sind. Mit der substr()-Funktion wurde der LF von der Zeile (bzw. dem letzten Feld) abgeschnitten.
Nun beginnt das Spiel rückwärst. Jenachdem, wie Du ausgeben willst, musst Du die Zeichenketten (Feldinhalte) aufbereiten.
Zu Ausgabe in reinem HTML-Text (also nicht in Formularfeldern) reicht:
1. Tauschen des ZU in "<br />" mit Hilfe der str_replace()-Funktion.
2. Entfernen der HTML-Tags mit strip_tags()
3. oder Umwandeln der HTML-Tags mit htmlspecialchars();
4. Escapesequenzen entfernen mit strip_slashes()
damit nicht nachher überall "sozusagen" steht.
Nun müsstest Du aber zurecht kommen.
Grüße
Tom