Sven Rautenberg: linebreaks herausfiltern ... und ersetzen ...

Beitrag lesen

Hi Leute,

in einer Variablen ($varText) sind Zeilenumbrüche in Form von <br /> enthalten; diese Var soll in einer textarea angezeigt werden.

print '<textarea ...>' . $varText . '</textarea>';

  
Mal abgesehen davon, wie gut oder schlecht \_diese\_ obige Idee ist, die Frage: Woher kommt diese Textvariable genau? Kriegst du sie zufällig aus einer deiner Textareas, die ursprünglich mal leer waren? Dann solltest du anders vorgehen!  
  
Eine leere Textarea ist kein Problem. :)  
  
Wenn sie ausgefüllt wird, kriegst du als Resultat einen String mit vielen schönen Zeichen und ein paar Zeilenumbrüchen der Art "\n" drin.  
  
Solch einen String kannst du auf zweierlei Art verwenden: Einmal kannst du ihn zurück in eine Textarea schreiben wollen, andererseits kannst du ihn auch als HTML-Inhalt ausgeben.  
  
Wenn du den String in eine Textarea ausgibst, mußt zu zwingend die möglicherweise enthaltenen HTML-Tags maskieren! Sonst tipp dir jemand den String </textarea> ein, und du bist in Schwierigkeiten. Für diesen Fall kennt PHP die Funktion htmlspecialchars(), welche alle <, > und & in die ungefährlichen Zeichen <, > und & umwandelt (ich glaube, " wird auch in " gewandelt). Die Zeilenumbrüche müssen nicht behandelt werden, sondern dürfen original bleiben.  
  
Wenn du die Eingabe allerdings außerhalb einer Textarea haben willst, dann kommt es darauf an, ob der Benutzer in die Textarea HTML eingeben darf oder nicht.  
  
Darf er es, besteht eigentlich kein Grund, die Ausgabe mit nl2br() (welche bekanntermaßen die <br /> einfügt) zu umbrechen: Gib einfach den kompletten String aus, wie er ist. Der Benutzer hätte mit Sicherheit <br> eingefügt, wenn er sie gewollt hätte.  
  
Wenn kein HTML erlaubt, ist, mußt du wiederrum die bösen HTML-Zeichen maskieren (ansonsten tippt dir noch einer ein böses Javascript ins Textfeld), und außerdem noch die Zeilenumbrüche wandeln. Maskieren steht oben - htmlspecialchars() - und die Zeilenumbrüche werden \_erst bei der endgültigen Ausgabe\_ mit nl2br() umgewandelt. Paß auf, dass du die richtige Reihenfolge einhälst: Erst htmlspecialchars(), dann nl2br().  
  
Zusammengefaßt:  
echo "<textarea>".htmlspecialchars($string)."</textarea>";  
und  
echo "Eingabe: ".nl2br(htmlspecialchars($string));  
  
Das Speichern des Strings erfolgt unverändert, beispielsweise in einer Datei oder der Datenbank.  
  
 - Sven Rautenberg