str_replace
Finea
- php
Moin,
echo "<textarea>";
echo str_replace("<br />","\n",$Text);
echo "</textarea>";
Ich möchte, dass alle <br />, die in $Text enthalten sind durch ein \n ersetzt werden und dann RICHTIG innerhalb der Textarea angezeigt werden.
Gebe ich einen $Text vor, der folgendes beinhaltet: "ERSTE ZEILE<br /><br />DRITTE ZEILE", so wird das ganze allerdings mit 3 (!!) Zeilen zwischen den Wörtern ERSTE ZEILE und DRITTE ZEILE angezeigt. - In der DB ist trotzdem alles richtig. Wieso?
Hi,
echo "<textarea>";
echo str_replace("<br />","\n",$Text);
echo "</textarea>";Ich möchte, dass alle <br />, die in $Text enthalten sind durch ein \n ersetzt werden und dann RICHTIG innerhalb der Textarea angezeigt werden.
Warum sind denn *überhaupt* <br /> darin enthalten?
Speichere Daten immer in Rohform.
Die Umwandlung Zeilenumbruch in BR ist nur für die Ausgabe als Inhalt im Kontext HTML notwendig - also mache sie auch erst dann.
Gebe ich einen $Text vor, der folgendes beinhaltet: "ERSTE ZEILE<br /><br />DRITTE ZEILE", so wird das ganze allerdings mit 3 (!!) Zeilen zwischen den Wörtern ERSTE ZEILE und DRITTE ZEILE angezeigt. - In der DB ist trotzdem alles richtig. Wieso?
Vermutlich, weil dein Text nicht *nur* BR, sondern BR *und* Zeilenumbruch enthält. Das ist nämlich das, was nl2br macht - es *ersetzt* Zeilenumbrüche nicht durch BR, sondern fügt BR *hinzu*.
MfG ChrisB
Hallo ChrisB,
Vermutlich, weil dein Text nicht *nur* BR, sondern BR *und* Zeilenumbruch enthält. Das ist nämlich das, was nl2br macht - es *ersetzt* Zeilenumbrüche nicht durch BR, sondern fügt BR *hinzu*.
*Kannst* *du* *das* *bitte* *nochmal* *erklären*? *Ich* *sehe* *gerade* *den* *Himmel* *vor* *lauter* *Sternen* *nicht*.
SCNR
Richard
Hallo Richard!
Vermutlich, weil dein Text nicht *nur* BR, sondern BR *und* Zeilenumbruch enthält. Das ist nämlich das, was nl2br macht - es *ersetzt* Zeilenumbrüche nicht durch BR, sondern fügt BR *hinzu*.
*Kannst* *du* *das* *bitte* *nochmal* *erklären*? *Ich* *sehe* *gerade* *den* *Himmel* *vor* *lauter* *Sternen* *nicht*.
SCNR
»Mein Gott, es ist voller Sterne!«
»So oder ähnlich hätten Sie ChrisB foppen können,
Würden Sie Bildung und Verstand Ihr eigen nennen«
Aber diesmal wirklich SCNR ;)
A propos es-ist-voller-sterne: http://old.atomic-eggs.com/cgi-bin/fehler.cgi?view&page148
Richard
Viele Grüße aus Frankfurt/Main,
Patrick
Gut, vielen Dank. Ich hatte nl2br(htmlspecialchars($Text)); und nicht htmlspecialchars(nl2br($text)) stehen. Jetzt wird das ganze auch als <br /> gespeichert, wie vorgesehen. Nach deinem Hinweis ist mir aufgefallen, dass in der DB tatsächlich nicht nur <br /> sondern danach noch ein ganz normaler Zeilenumbruch innerhalb des Strings gespeichert wird. Soll ich jetzt also noch str_replace("\n","",$Text); hinzufügen, damit keine \n vorkommen, oder gibt es da noch eine bessere Möglichkeit?
Hi,
Gut, vielen Dank. Ich hatte nl2br(htmlspecialchars($Text)); und nicht htmlspecialchars(nl2br($text)) stehen. Jetzt wird das ganze auch als <br /> gespeichert, wie vorgesehen.
Noch mal: Es ist unklug, Daten in dieser Form zu speichern.
Soll ich jetzt also noch str_replace("\n","",$Text); hinzufügen, damit keine \n vorkommen, oder gibt es da noch eine bessere Möglichkeit?
Noch mal: Speichere Rohdaten, und bereite sie bei der Ausgabe dem jeweiligen Kontext entsprechend auf.
MfG ChrisB
Hi,
Gut, vielen Dank. Ich hatte nl2br(htmlspecialchars($Text)); und nicht htmlspecialchars(nl2br($text)) stehen. Jetzt wird das ganze auch als <br /> gespeichert, wie vorgesehen.
Noch mal: Es ist unklug, Daten in dieser Form zu speichern.
Soll ich jetzt also noch str_replace("\n","",$Text); hinzufügen, damit keine \n vorkommen, oder gibt es da noch eine bessere Möglichkeit?
Noch mal: Speichere Rohdaten, und bereite sie bei der Ausgabe dem jeweiligen Kontext entsprechend auf.
MfG ChrisB
So? Wie soll ich sie denn dann speichern? Angenommen $Text besteht aus:
$Text = "
Guten Morgen
Ich bin nicht die Signatur
Ich putze hier nur...
"
Dann brauche ich mindestens 2 Zeilenumbrüche. Irgendwie muss in der DB gespeichert werden, dass dort 2 Zeilenumbrüche sind. Wenn nicht durch <br /> oder durch <br /> wie soll ich sie dann bitte speichern?
Hi,
bitte zitiere sinnvoll, das worauf du dich konkret beziehst - und nicht komplette Postings.
So? Wie soll ich sie denn dann speichern? Angenommen $Text besteht aus:
$Text = "
Guten Morgen
Ich bin nicht die Signatur
Ich putze hier nur...
"Dann brauche ich mindestens 2 Zeilenumbrüche. Irgendwie muss in der DB gespeichert werden, dass dort 2 Zeilenumbrüche sind.
In dem Wert, den du angegeben hast, *sind* bereits Zeilenumbrüche enthalten.
Also speichere diesen Text, so wie er ist.
MfG ChrisB
Also speichere diesen Text, so wie er ist.
Gut, hab ich mal umgebaut. Bevor ein Eintrag jetzt eingebaut wird, wird auf ihn nur noch htmlspecialchars($Text) angewandt. Dieser wird dann so in die DB geschrieben. Habe ich in meinem Eintrag Zeilenumbrüche, wird das auch korrekt gespeichert, bei der Ausgabe wiederum wird das ganze nicht korrekt angezeigt. Ich stehe total auf dem Schlauch. Hilfe bitte.
Hi,
Also speichere diesen Text, so wie er ist.
Gut, hab ich mal umgebaut. Bevor ein Eintrag jetzt eingebaut wird, wird auf ihn nur noch htmlspecialchars($Text) angewandt. Dieser wird dann so in die DB geschrieben.
Du sollst ihn in die Datenbank speichern, *bevor* du irgendwelche Funktionen darauf anwendest, die ihn inhaltlich verändern!
Habe ich in meinem Eintrag Zeilenumbrüche, wird das auch korrekt gespeichert, bei der Ausgabe wiederum wird das ganze nicht korrekt angezeigt.
Dann wende bei der Ausgabe die für die notwendingen Umwandlungen zuständigen Funktion auf den Text an.
MfG ChrisB
Du sollst ihn in die Datenbank speichern, *bevor* du irgendwelche Funktionen darauf anwendest, die ihn inhaltlich verändern!
Wenn ich das mache kann Schadcode eingeschleust werden?
Hi,
Du sollst ihn in die Datenbank speichern, *bevor* du irgendwelche Funktionen darauf anwendest, die ihn inhaltlich verändern!
Wenn ich das mache kann Schadcode eingeschleust werden?
Arbeite bitte diesen Artikel vollständig durch: http://aktuell.de.selfhtml.org/artikel/php/kontextwechsel/
MfG ChrisB
Hello,
Also speichere diesen Text, so wie er ist.
Das wäre die Aufgabe.
Da Du den Text aber vermutlich per Textschnittstelle (SQL) an eine Datenbank übergibst und nicht per Blockbuffer (Bei PHP und MySQL auch als 'Prepared Statement' bezeichnet), muss diese Textschnittstelle vor Daten geschützt werden, die sie anderenfalls als Steuerzeichen für sich selbst interpretieren würde. Dies geht immer am besten mit der dafür vom DBMS (vermutlich MySQL) und der benutzen API (hier PHP->DBMS) bereitgestellten Funktion. Es eignen sich dafür, je nach benutzten weiteren Funktionen
http://de3.php.net/manual/en/function.mysql-real-escape-string.php
http://de3.php.net/manual/en/mysqli.real-escape-string.php
wobei die mysqli-Funktionen zu bevorzugen sind. Sie sind überarbeitet worden bezüglich Sicherheit und Kompatiblität und werden überleben, während die ursprünglichen Mysql-Funktionen sicherlich irgendwann verschwinden werden aus dem Paket.
Gut, hab ich mal umgebaut. Bevor ein Eintrag jetzt eingebaut wird, wird auf ihn nur noch htmlspecialchars($Text) angewandt. Dieser wird dann so in die DB geschrieben.
Und genau DAS ist falsch. Htmlspecialchars() ist die Funktion zum Schutz der HTML-Schnittstelle, soll also vor der AUSGABE Richtung Browser benutzt werden. Um mit Daten aber ungestört arbeiten zu können, sollten diese in Rohform gespeichert werden, wenn es nicht einen triftigen Grund dagegen gibt.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg