![]() |
Re: nl2br(), nur nicht für HTML-Code
@Frederic: Ja, nur ich bin verantwortlich dafür, sonst würde ich auch kein HTML-Code zulassen. ;)
@Bigg: Ich dachte auch, dass ich einfach einen Tag um den HTML-Code setze und dieser Tag dann "weggeparst" wird und die darin enthaltenen Absätze nicht konvertiert werden. Das wäre eine sehr schöne Lösung finde ich, nur müsste ich da ja reguläre Ausdrücke verwenden und ich habe keine Ahnung, wie die aussehen müssen. |
Re: nl2br(), nur nicht für HTML-Code
Zitat:
1. In allen nicht HTML-Tags musst du HTML deaktivieren, indem du die Sonderzeichen "<" und ">" ersetzt. 2. Du benötigst eine Funkion ähnlich pos() die Anfang und Ende des jeweiligen Tags suchen. Die Spitzen klammern werden nur dann ersetzt, wenn Anfang und Ende existieren. Da beide Tags die gleiche Länge haben kannst du sogar überschreiben. 3. ... Wie wäre es, wenn du das ganze mal in Delphi umsetzt, kommentierst und nach PHP portierst? :> Oder du suchst dir eine fertige Lösung bzw. passt diese dann noch an. Dat kriste doch hin ;-) |
Re: nl2br(), nur nicht für HTML-Code
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:
Damit werden alle Zeilenende (\r oder \n) mit einem "
preg_replace("/([^>])[\r\n]/", "\\1
", $input); " ersetzt die nicht an einem geschlossenen HTML-Tag enden. Insgesamt würde ich das dann etwa folgendermassen verwenden:
Delphi-Quellcode:
Damit werden somit alle Zeilenendungen durch "
<?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); " 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:
Die Bedingung in obigem Regex, wenn kein "
$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"; " 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 |
Re: nl2br(), nur nicht für HTML-Code
Hi
Zitat:
Zitat:
Bei Code wie:
Code:
Wird nach der Anwendung des regulären Ausdrucks kein Absatz zwischen dem text und dem darauf folgenden Bild gemacht. Der Text klebt also direkt über dem Bild, was mir noch nicht gefällt. Ansonsten funktioniert es, soweit ich das sehen kann, alles bestens. Aber auch mit dem kleinen Schönheitsfehler könnte ich leben. ;)
[...] hier steht ein text
<div class="center">[img]...[/img]</div> Zitat:
Was mich dennoch interessieren würde (ich weiß nicht, ob ich das so mache): Angenommen, ich fasse solche komplexeren HTML-Blocke in einen -BBCode. Wie kompliziert wäre es dann, das mit regulären Ausdrücken zu lösen? |
Re: nl2br(), nur nicht für HTML-Code
Hallo,
Zitat:
Delphi-Quellcode:
preg_replace("/(([^>])[\r\n])|^([\r\n])/m", "\\1
", $input); Zitat:
Ansonsten kann man das auch "von Hand" also ohne regex zerlegen - aber das kommt meiner Meinugn nach letztendlich alles auf das gleich raus. :-) Viele Grüße, Eike |
Re: nl2br(), nur nicht für HTML-Code
Warum parst du eigentlich nicht beim Absenden und trägst das ganze (evtl. in einer neuen Spalte) direkt so in die Datenbank ein? Das sollte in jedem Fall schneller sein, egal, welche Lösung du verwendest... :wink:
|
Re: nl2br(), nur nicht für HTML-Code
Zitat:
Stimmt, ob das andere viel bringt weiß ich auch nicht. Zitat:
Sollte es einmal merklich langsamer werden, habe ich ja immer noch die Option, das ganze zu optimieren und deinen Vorschlag umzusetzen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz