Obelix: \r und Leerzeichen

Tach,

Also ich lese Text aus einer MySQL Datenbank aus.
Jetzt habe ich 2 Ersetzungsfragen:

1. Ich habe \r bis jetzt immer einfach rausgelöscht (durch nichts ersetzt), weil es eh keinen Effekt hatte. Welche Funktion hat \r eigentlich und sollte man das doch durch einen HTML Tag o.ä. ersetzen?

2. Leerzeichen habe ich bis jetzt so gelassen, wodurch natürlich mehrere Leerzeichen bei der Ausgabe trotzdem nur wie eines behandelt wurden. Als ich es jetzt mal mit   probiert habe, ist der Text aber total aus den fugen geraten, also es gab irgendwie keine automatischen Zeilenumbrüche mehr bei der Ausgabe.
Trotzdem würde ich gerne mehrere Leerezeichen auch bei der Ausgabe als solche darstellen, wie mache ich das am besten? Erschwerdend kommt noch hinzu, dass ich auch Links ersetze und da da manchmal auch einfach Leerzeichen statt %20 steht, gibts dann mitten im Link ein

Ich hoffe ihr könnt mir helfen, big thx :)

  1. Hallo,

    1. Ich habe \r bis jetzt immer einfach rausgelöscht (durch nichts ersetzt), weil es eh keinen Effekt hatte. Welche Funktion hat \r eigentlich und sollte man das doch durch einen HTML Tag o.ä. ersetzen?

    \n, \r und \r\n sind die Zeilenumbrueche in verschiedenen Systemen

    \n (LF) - Unix/Linux
    \r (CR) - Mac
    \r\n (CR LF) - Windows

    In HTML werden Zeilenumbrueche wie Leerzeichen behandelt.
    Je nachdem, was Du fuer Inhalte in der DB hast und wie sie ausgegeben werden,
    solltest Du also \n, \r und \r\n statt zu loeschen besser durch Leerzeichen ersetzen.

    Wenn Du hingegen willst, dass sie als Zeilenumbruch angezeigt werden,
    solltest Du sie fuer HTML in <br> umwandeln mit der PHP-Funktion nl2br().

    1. Leerzeichen habe ich bis jetzt so gelassen, wodurch natürlich mehrere Leerzeichen bei der Ausgabe trotzdem nur wie eines behandelt wurden.

    Normales HTML-Verhalten halt.

    Trotzdem würde ich gerne mehrere Leerezeichen auch bei der Ausgabe als solche darstellen, wie mache ich das am besten? Erschwerdend kommt noch hinzu, dass ich auch Links ersetze und da da manchmal auch einfach Leerzeichen statt %20 steht, gibts dann mitten im Link ein

    1. Schritt: Leerzeichen in URLs ersetzen.
    Dabei hilft Dir wohl die dclp-FAQ weiter:
    Wie finde ich alle Links in einer HTML-Datei?
    http://www.dclp-faq.de/q/q-regexp-links-finden.html

    2. Schritt: Alle Vorkommen von "  " (zwei Leerzeichen) durch "  " ersetzen.
    So oder aehnlich wird es offenbar auch hier im Forum gemacht.

    Gruesse,

    Thomas

    1. Hallo Ihr zwei und alle Anderen,

      Wenn Du hingegen willst, dass sie als Zeilenumbruch angezeigt werden,
      solltest Du sie fuer HTML in <br> umwandeln mit der PHP-Funktion nl2br().

      Der Ordnung halber: durch nl2br() werden die \n-Zeichen nicht ausgetauscht, sondern durch Einfügen dahinter um ein <br /> ergänzt.

      Wenn man dann nachher die Tags wieder entfernt, sind die \n Zeichen also noch da. Das kann sehr praktisch sein.

      Außerdem gibt es eingige "Automatik-Einstellungen" bei PHP, die darüber entscheiden, ob nun genau nach \n  \r  oder \r\n gesucht wird.

      Grüße

      Tom

  2. Hallo,

    1. Ich habe \r bis jetzt immer einfach rausgelöscht (durch nichts ersetzt), weil es eh keinen Effekt hatte. Welche Funktion hat \r eigentlich und sollte man das doch durch einen HTML Tag o.ä. ersetzen?

    Du solltest Deine Daten vor der Übergabe an MySQL mit der Funktion mysql_escape_string() oder sogar mysql_real_escape_string() behandeln. Dann kannst Du eigentlich alle Zeichen im Nutzdatenstrom drinlassen. Was Du dann mit den Zeichen bei der Ausgabe auf den Client anstellst, leigt ja vom Typ des Ausgabefeldes (plain HTML, Textarea, input...) ab.

    1. Leerzeichen habe ich bis jetzt so gelassen,...

    Trotzdem würde ich gerne mehrere Leerezeichen auch bei der Ausgabe als solche darstellen,

    Das hat i.d.R. nur Sinn bei einer diktengleichen Darstellung, also einem monotype-Font und der Verwendung der Tags <pre> ... </pre>

    Dann werden nämlich plötzlich auch deine \r Zeichen wieder angezeigt.

    Grüße

    Tom

    1. Nun, ich glaube hier liegt ein Missverständnis vor.
      Die Daten gebe ich wie sie vom User kommen in die DB.

      Erst beim Auslesen werden \n und \r mit HTML Tags bzw. durch nichts ersetzt.

      Ich mache es immer so:

      $bla = str_replace("\r", "", $bla);
      $bla = str_replace("\n", "<br />", $bla);

      nl2br() verwende ich schon deshalb nicht, weil das <br> statt <br /> schreibt, ich möchte aber XHTML Konform bleiben.

      Was mich jetzt nur noch interessieren würde: da ich die \r durch kein <br /> ersetze, wird die Seite auf einem Mac also falsch dargestellt. Ersetze ich das \r aber auch noch durch <br /> habe ich auf Linux und Windows also zwei statt einem Zeilenumbruch? Das finde ich dumm. Und was macht \r alleine eigentlich? Wie heisst das?

      1. Hallo zurück,

        Nun, ich glaube hier liegt ein Missverständnis vor.
        Die Daten gebe ich wie sie vom User kommen in die DB.

        Genau da liegt der erste hase im Pfeffer. Die daten vor der Übergabe an MySQL immer erst durch mysql_escape_string() schicken, wenn Dir Deine Datenbank lieb ist.

        Erst beim Auslesen werden \n und \r mit HTML Tags bzw. durch nichts ersetzt.

        Ich mache es immer so:

        $bla = str_replace("\r", "", $bla);
        $bla = str_replace("\n", "<br />", $bla);

        Ich würde es so machen:

        $bla = str_replace("\r\n", "<br />", $bla);
        $bla = str_replace("\r", "<br />", $bla);
        $bla = str_replace("\n", "<br />", $bla);

        Dann werden die Zeilenumbrüche immer ersetzt, so wie sie sollen.
        Windows-Browser sind übrigens so gemein und ersetzen bei der Datenaufbereitung ein einzelnes  \r oder  \n automatisch durch ein \r\n

        Wenn man die Daten (aus einer Textarea) dann wieder zum Server sendet, steht auf jeden Fall \r\n  drin.

        Kannst ja mal schauen, wie man das beweisen kann.

        nl2br() verwende ich schon deshalb nicht, weil das <br> statt <br /> schreibt, ich möchte aber XHTML Konform bleiben.

        Ich meine, das kann man einstellen

        Was mich jetzt nur noch interessieren würde: da ich die \r durch kein <br /> ersetze, wird die Seite auf einem Mac also falsch dargestellt.

        Ich würde immer mit \r\n zurückübersetzen, da man ja nicht sicher weiß, was für ein Client auf Antwort wartet.

        Grüße

        Tom

        1. mysql_escape_string() habe ich bis jetzt nie benutzt und es hat aber immer geklappt. Ich denke da wird irgendwas in der php.ini automatisch eingestellt sein. Sollte bzw. kann man trotzdem mysql_escape_string() benutzen oder gibts dann Probleme?
          Und wird der String dann normal in der DB gespeichert oder mit den  maskierten Zeichen?

          1. Hallo Obelix,

            gut, dass Du nochmal darauf hinweist.

            Natürlich ist das was eingestellt in der ini, nämlich magic_quotes_gpc

            Da löst automatisch ein addslashes() aus.

            Das ist schon sowas ähnliches, wie mysql_escape_string. Leider nur sowas ähnliches. Also müsste man das entweder ausschalten, oder

            $var = mysql_escape_string(stripslashes($var));

            schreiben, bevor die Daten an die Datenbank übergeben werden.

            mysql_escape_string() habe ich bis jetzt nie benutzt und es hat aber immer geklappt. Ich denke da wird irgendwas in der php.ini automatisch eingestellt sein. Sollte bzw. kann man trotzdem mysql_escape_string() benutzen oder gibts dann Probleme?
            Und wird der String dann normal in der DB gespeichert oder mit den  maskierten Zeichen?

            Also keinesfalls doppelt maskieren, sondern erst wieder normalisieren und dann mit der passenden Funktion maskieren.

            AddSlashes() ist nur eine Ungefährlösung, die bei der Vielzahl von PHP unterstützten DBS die schlimmsten Probleme verhindert.

            Grüße

            Tom

            1. Und wenn dieses Skript nun aber auf vielen Servern genutzt werden soll, bei denen magic_quotes_gpc nicht immer aktiviert ist, es also immer unterschiedlich ist? Was soll ich dann machen?

              1. Hallo Obelix,

                Und wenn dieses Skript nun aber auf vielen Servern genutzt werden soll, bei denen magic_quotes_gpc nicht immer aktiviert ist, es also immer unterschiedlich ist? Was soll ich dann machen?

                Dann solltest Du vorher abfragen, ob es gesetzt ist, und es ggf. ausschalten.

                siehe:

                ini_get()
                  ini_set()

                oder eben die Ausführung der Funktion stripslashes() von ini_get("magic_quotes_gpc") abhängig machen.

                Universelle Scripte zu schreiben, ist ziemlich schwierig. Ich habe da immer Ärger mit den Image-Funktionen der GD-Lib. Unser Produktivserver kann keine GIF-Unterstützung, der Testserver hat sie aber noch usw.

                Grüße

                Tom

                1. Ich werds mir ansehen, danke.

                  Universelle Scripte zu schreiben, ist ziemlich schwierig.

                  Wem sagst du das :)
                  Aber man muss eben Kompromisse eingehen und auf manche spezielle Dinge verzichten.