Einzelnen Beitrag anzeigen

ehoffman

Registriert seit: 3. Jan 2006
Ort: Braunschweig
15 Beiträge
 
Delphi 2006 Enterprise
 
#13

Re: nl2br(), nur nicht für HTML-Code

  Alt 13. Jul 2006, 03:04
Hallo zusammen,

normalerweise lese ich hier nur mit, da ich zu den Delphi-Problemen nie wirklich etwas gutes sagen kann In diesem Fall kann ich aber durchaus auch etwas beitragen (denke ich zumindest). Grundsätzlich sollte die gesuchte Funktionalität mit folgender Regular Expression nach der in Perl verwendeten Syntax machbar sein (da nach PHP gefragt ist der Code auch in PHP):

Delphi-Quellcode:
preg_replace("/([^>])[\r\n]/", "\\1
", $input);
Damit werden alle Zeilenende (\r oder \n) mit einem "
" ersetzt die nicht an einem geschlossenen HTML-Tag enden. Insgesamt würde ich das dann etwa folgendermassen verwenden:

Delphi-Quellcode:
<?php
// Beispiel Eingabe aus dem Posting
$input = "Bla bla blubb di wupp\n".
         "hier eine neue zeile\n".
         "und da noch eine\n".
         "wuppdi und nun folgt eine Tabelle:\n".
         "\n".
         "<table>\n".
         " <tr>\n".
         " <td>Hallo</td>\n".
         " </tr>\n".
         "</table>\n".
         "\n".
         "Hier wieder Text\n".
         "mit Zeilenumbruch\n";

// Ersetze Windows Zeilenendungen durch ein einfaches \n wie unter UNIX ueblich
$input = preg_replace("/\r\n/", "\n", $input);

// Ersetze Mac oder UNIX Zeilenendungen durch ein
 wenn nicht hinter
// schließenden HTML-Tag
echo preg_replace("/([^>])[\r\n]/", "\\1
", $input);
Damit werden somit alle Zeilenendungen durch "
" ersetzt die sich nicht direkt hinter einem schließenden HTML-Tag befinden - es werden also auch die Zeilenenden erfasst die innerhalb eines HTML-Tags liegen, z.B. bei:

Delphi-Quellcode:
$input = "Bla bla blubb di wupp\n".
         "hier eine neue zeile\n".
         "und da noch eine\n".
         "wuppdi und nun folgt eine Tabelle:\n".
         "\n".
         "<table>\n".
         " <tr>\n".
         " <td>Hallo\n".
         " auch hier ist noch Text\n".
         " und hier sowieso\n".
         " aber nun ist genug</td>\n".
         " </tr>\n".
         "</table>\n".
         "\n".
         "Hier wieder Text\n".
         "mit Zeilenumbruch\n";
Die Bedingung in obigem Regex, wenn kein "
" gesetzt werden soll ist das vor dem Zeilenumbruch ein ">" steht. Eventuelle Leerzeichen (wie hier im Beispiel zur Formatierung genutzt) bleiben erhalten. Es sollte auch darauf geachtet werden, dass alle ">" die nicht mit HTML-Tags zu tun haben (z.B. in math. Formeln) und nach denen ein zu konvertierendes Zeilenende steht vor der Konvertierung der Zeilenenden verschwunden sind, da es sonst nicht konvertiert werden würde. Hier könnte die PHP-Funktion "htmlspecialchars" helfen, da aber im Text HTML-Tags vorkommen können kann die Funktion nicht verwendet werden (auch die HTML-Tags selber würden damit geändert). Das muss also irgendwie im Editor geleistet werden - sprich HTML-Entities "abfangen" und ersetzen.

Noch eine Anmerkung: Das Ganze sollte im Prinzip funktionieren, aber HTML Code kann manchmal recht komplex werden - insbesondere wenn der Editor nicht bekannt ist - insofern keine Garantie das der Code in jedem Fall zum gewünschten Ergebnis führt

Viele Grüße,
Eike
Eike
  Mit Zitat antworten Zitat