Finea: str_replace

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?

  1. 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

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. 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

      1. 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

        --
        _ - jenseits vom delirium - _

           Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
    2. Gut, vielen Dank. Ich hatte nl2br(htmlspecialchars($Text)); und nicht htmlspecialchars(nl2br($text)) stehen. Jetzt wird das ganze auch als &lt;br /&gt; gespeichert, wie vorgesehen. Nach deinem Hinweis ist mir aufgefallen, dass in der DB tatsächlich nicht nur &lt;br /&gt; 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?

      1. Hi,

        Gut, vielen Dank. Ich hatte nl2br(htmlspecialchars($Text)); und nicht htmlspecialchars(nl2br($text)) stehen. Jetzt wird das ganze auch als &lt;br /&gt; 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

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        1. Hi,

          Gut, vielen Dank. Ich hatte nl2br(htmlspecialchars($Text)); und nicht htmlspecialchars(nl2br($text)) stehen. Jetzt wird das ganze auch als &lt;br /&gt; 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 &lt;br /&gt; wie soll ich sie dann bitte speichern?

          1. 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

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
            1. 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.

              1. 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

                --
                “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
                1. 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?

                  1. 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

                    --
                    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
              2. 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

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de