Ankündigung

Einklappen
Keine Ankündigung bisher.

nl2br und Alternativen....

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • nl2br und Alternativen....

    Nach stundenlanger Suche bitte ich um eure Hilfe... Ich ziehe einen String aus einer XML Datei im UTF8 Format. Ziel ist es die \n durch <BR> zu ersetzen... eigentlich kein Problem und schon 100mal diskutiert.... es klappt aber nicht
    Folgendes hab ich schon alles ausprobiert, in den unterschiedlichsten Varianten....

    PHP-Code:
    $longdesc utf8_decode($xml_res->Product->ProductDescription["LongDesc"]);
    $longdesc htmlentities($longdescENT_QUOTES);
    $longdesc preg_replace("/\n/""<br>"$longdesc);
    $longdesc str_replace("/\n/""<br>"$longdesc);
    $longdesc eregi_replace("\n"'<br />'$longdesc);
    $longdesc nl2br($longdesc); 
    Bei der folgenden Abfrage kommt ein TRUE heraus....
    PHP-Code:
    if (eregi('\n'$longdesc)) 
    Könnte mir jemand die Kleinigkeit verraten, die ich gerade total übersehe? Vielen dank schonmal!

  • #2
    Mach dir mal den Unterschied zwischen Single und Double Quotes klar.
    [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

    Kommentar


    • #3
      Zitat von HTML 4.01-Spezifikation
      Ein Zeilenumbruch ist definiert als Wagenrücklauf (carriage return, &#x000D, ein Zeilenvorschub (line feed, &#x000A oder ein Wagenrücklauf/Zeilenvorschub-Paar.
      Quelle: http://www.edition-w3.de/TR/1999/REC...t.html#h-9.3.2

      carriage return: \r
      line feed: \n

      Der Zeilenumbruch an sich hat nichts mit UTF-8 oder so zu tun, sondern mit dem Betriebssystem.

      Unter Windows ist \r\n (\015\012) üblich.
      Unter UNIX-Systemen ist \n (\012) üblich.
      Und Mac bevorzugt \r (\015)
      "Nein, nein das Beste an Zombieland ist: Keine Facebook-Status-Updates mehr.
      'Rob Curtis freut sich schon auf Freitag', wen interessierts?"

      Kommentar


      • #4
        „es klappt aber nicht...“ ist keine sinnvolle Fehlerbeschreibung
        [COLOR="#F5F5FF"]--[/COLOR]
        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
        [COLOR="#F5F5FF"]
        --[/COLOR]

        Kommentar


        • #5
          Warum nicht einfach nur nl2br()? Lass die anderen replace-Operationen weg. Übrigens ist str_replace() keine Funktion für Reguläre Ausdrücke, /\n/ existiert also vermutlich in genau dieser Schreibweise bei dir im XML nicht.
          "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

          Kommentar


          • #6
            Zitat von alex177 Beitrag anzeigen
            Nach stundenlanger Suche bitte ich um eure Hilfe...
            Handbuchlesen kann einem oft stundenlanges Probieren ersparen.

            Ich ziehe einen String aus einer XML Datei im UTF8 Format. Ziel ist es die \n durch <BR> zu ersetzen... eigentlich kein Problem und schon 100mal diskutiert.... es klappt aber nicht
            Folgendes hab ich schon alles ausprobiert, in den unterschiedlichsten Varianten....

            PHP-Code:
            $longdesc utf8_decode($xml_res->Product->ProductDescription["LongDesc"]);
            $longdesc htmlentities($longdescENT_QUOTES);
            $longdesc preg_replace("/\n/""<br>"$longdesc);
            $longdesc str_replace("/\n/""<br>"$longdesc);
            $longdesc eregi_replace("\n"'<br />'$longdesc);
            $longdesc nl2br($longdesc); 
            Bei der folgenden Abfrage kommt ein TRUE heraus....
            PHP-Code:
            if (eregi('\n'$longdesc)) 
            Könnte mir jemand die Kleinigkeit verraten, die ich gerade total übersehe? Vielen dank schonmal!
            Returns string with '<br />' or '<br>' inserted before all newlines.
            (aus: www.php.net/manual/en/function.nl2br.php)

            Die Kleinigkeit lautet "inserted before all newlines". Sprich: nl2br() ersetzt Zeilenumbrüche nicht, sondern fügt vor Zeilenumbrüchen ein "<br />" ein. Deswegen ergibt dein eregi-Test TRUE. Der Name der Funktion ist etwas unglücklich gewählt. In anderen Scriptsprachen baut man sich sowas selbst, das gibt einem zusätzlich die Möglichkeit, die Zeilenumbruch-Erkennung flexibel genug auszulegen:

            PHP-Code:
            function linefeed2br(
                
            $in,
                
            $preserve FALSE // preserve line-feeds?
            ) {
                return 
            preg_replace(
                    
            '/(\x0d?\x0a)/'// erkennt "\r\n" und "\n"
                    
            empty ($preserve) ? '<br />' '$1<br />'
                    
            $raw
                
            );

            Anderes Thema:

            Warum benutzt du htmlentities() nach utf8_decode()? Nach utf8_decode() liegt der Text in ISO-Latin-1 vor. Dort nicht bekannte Zeichenpositionen sind nach utf8_decode() schon verloren. Wenn schon, solltest du umgekehrt vorgehen: Erst htmlentities(,, 'UTF-8') und danach utf8_decode(). Das erhält wenigstens ein paar Unicode-Zeichen. Besser wäre es natürlich, wenn du gleich bei UTF-8 bleibst.
            Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

            Kommentar


            • #7
              @Heiko .. Hexadezimal -> dezimal umrechnen üben wir aber nochmal ... oder sollte das Hexadezimal -> Oktal Umrechnung sein ? ...

              d / a sind immer noch 13 / 10 .....
              "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

              Kommentar


              • #8
                wow! zahlreiche meldungen, danke!
                Ich verstehe die Problematik zwar immer noch nicht genau, habe es letzte Nacht dann aber doch noch hingekriegt, mit:

                PHP-Code:
                $longdesc htmlentities($longdescENT_QUOTES"UTF-8");
                $longdesc str_replace('\n','<BR>',$longdesc); 


                @nikosch:
                „es klappt aber nicht...“ ist keine sinnvolle Fehlerbeschreibung
                Ziel ist es die \n durch <BR> zu ersetzen [...] es klappt aber nicht
                halte ich durchaus für klar Verständlich, oder? Ich liebe ja die Jungs und Mädels die jeden Thread erstmal mit motzen beginnen müssen... Trotzdem danke!

                Kommentar


                • #9
                  Du beschreibst was du haben möchtest ja, aber "klappt nicht" bleibt weiterhin eine dämliche Beschreibung. Das kann heißen dass Fehler geworfen werden, nichts passiert, etwas falsches passiert... Das sollte wohl klar sein. Es macht eben wenig Spass zu raten, was nicht funktioniert. Mit Motzen hat das nichts zu tun.
                  "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

                  Kommentar


                  • #10
                    Zitat von eagle275 Beitrag anzeigen
                    @Heiko .. Hexadezimal -> dezimal umrechnen üben wir aber nochmal ... oder sollte das Hexadezimal -> Oktal Umrechnung sein ? ...

                    d / a sind immer noch 13 / 10 .....

                    Ich bin für Nachhilfe natürlich immer gern zu haben, lerne ja gerne noch dazu, aber:
                    Wenn du doch selber schon erkannt hast, dass das Oktal ist, erübrigt sich wohl deine Frage.
                    "Nein, nein das Beste an Zombieland ist: Keine Facebook-Status-Updates mehr.
                    'Rob Curtis freut sich schon auf Freitag', wen interessierts?"

                    Kommentar


                    • #11
                      Zitat von fireweasel Beitrag anzeigen
                      Die Kleinigkeit lautet "inserted before all newlines". Sprich: nl2br() ersetzt Zeilenumbrüche nicht, sondern fügt vor Zeilenumbrüchen ein "<br />" ein.
                      Dann wäre aber nl2br nicht auf „klappt nicht“ hinausgelaufen.

                      Deswegen ergibt dein eregi-Test TRUE.
                      Nein, der ergibt deshalb true, weil er nicht auf ein Zeilenvorschubzeichen testet, sondern auf die Zeichenfolge Backslash-n.
                      Deshalb wies ich ja direkt zu Anfang auf single. vs. double quotes hin.

                      Dieser fehlerhafte bzw. fehlerhaft interpretierte „Test“ sowie das „nicht funktionieren“ von nl2br deuten also klar auf die eigentliche Fehlerursache hin:
                      Er hat in seinem String keine Zeilenumbrüche vorliegen, sondern die Zeichenkombination Backslash-n.

                      Ob das schon so im XML steht, oder ein weiterer unsinniger Verarbeitungsschritt, der uns vorenthalten wurde, dafür verantwortlich ist, soll er dann mal selber untersuchen.
                      [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

                      Kommentar


                      • #12
                        Zitat von ChrisB Beitrag anzeigen
                        Dann wäre aber nl2br nicht auf „klappt nicht“ hinausgelaufen.
                        Ob das Ersetzen mit nl2br() geklappt hat oder nicht, war nicht ersichtlich. Ich hätte den Text nach dem Ersetzen im Hex-Modus oder per rawurlencode() angesehen und nicht mit ereg() geprüft, wenn die eigenen Kenntnisse von Regulären Ausdrücken offensichtlich ausbaufähig sind. Und der Rückgabewert von ereg() war der Punkt, an dem der OP meinte, es klappe nicht.

                        Nein, der ergibt deshalb true, weil er nicht auf ein Zeilenvorschubzeichen testet, sondern auf die Zeichenfolge Backslash-n.
                        Ereg() gibt tatsächlich niemals true zurück, wie ich gerade feststellen musste (und wie ich auch im Handbuch hätte nachlesen können ). Entweder FALSE oder (in den speziellen Fällen hier) 1. Eine weitere Ungereimtheit. Warum ist heutzutage kaum jemand mehr in der Lage, var_dump() zu benutzen?

                        ..., weil er nicht auf ein Zeilenvorschubzeichen testet, sondern auf die Zeichenfolge Backslash-n.

                        Deshalb wies ich ja direkt zu Anfang auf single. vs. double quotes hin.

                        Dieser fehlerhafte bzw. fehlerhaft interpretierte „Test“ sowie das „nicht funktionieren“ von nl2br deuten also klar auf die eigentliche Fehlerursache hin:
                        Er hat in seinem String keine Zeilenumbrüche vorliegen, sondern die Zeichenkombination Backslash-n.

                        Ob das schon so im XML steht, oder ein weiterer unsinniger Verarbeitungsschritt, der uns vorenthalten wurde, dafür verantwortlich ist, ...
                        Ich habe meinen Post auch nur als ergänzenden Tipp gesehen, ...
                        * weil noch keine bestätigende Rückmeldung kam;
                        * ich mir nicht vorstellen konnte, dass sich jemand freiwillig '\n' in normale Texte einbaut (im OP-Quellcode war davon nichts zu sehen)
                        * und meine Kenntnisse über POSIX-Regex-Sonderzeichen beschränkt sind. Es hätte sein können, dass dort '\n' genauso wie in PCRE interpretiert wird.

                        Aber du lagst natürlich (von Anfang an) richtig. Was auch die endgültige "Lösung" beweist:

                        PHP-Code:
                        $longdesc htmlentities($longdescENT_QUOTES"UTF-8");
                        $longdesc str_replace('\n','<BR>',$longdesc); 
                        Was soll man dazu noch sagen?
                        Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                        Kommentar

                        Lädt...
                        X