nl2br nicht im ganzen String

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

  • nl2br nicht im ganzen String

    Hallo,

    folgendes Problem:

    Ich lese Daten aus einer Datenbank, und gebe diese in Artikelform auf einer Seite aus. Damit die Optik stimmt, verwende ich nl2br um die per Formular in die Datenbank eingepflegten Daten richtig zu formatieren.
    Nun ergibt sich das Problem, das wenn bspw. Html Code dabei ist, dort auch Zeilenumbrüche mit <br> ersetzt werden, und somit die Darstellung arg leidet.

    Frage: gibtes eine andere Funktion mit der ich das ganze umgehen kann?

  • #2
    ersetze doch erst alle html breaks mit einer neuen Zeile und dann nl2br
    Beantworte nie Threads mit mehr als 15 followups...
    Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

    Kommentar


    • #3
      Das ist nicht das Problem. Wenn ich z.bsp. den HTML Code einer Tabelle ausgebe, sieht das dann so aus:

      PHP-Code:
          <TD  width="8%">0,28</TD><br /> 
      d.h., nl2br macht ja auch dort ein <br> rein.

      Kommentar


      • #4
        Original geschrieben von MelloPie
        ersetze doch erst alle html breaks mit einer neuen Zeile und dann nl2br
        ich glaube nicht, dass er das gemeint hat...

        Wenn dein HTML code irgendwie durch bbcodes markiert ist, z.B.
        HTML-Code:
        dann dein code...
        dann kannst du diese Teile doch einfach rausnehmen. bzw. per explode() alles vor und nach diesen Strings mit nl2br() bearbeiten.

        /e: Sehe grad deine Antwort. Am besten funktioniert es, wenn du deinen HTML Code irgendwie kennzeichnest, beispielsweise, wie oben, durch
        HTML-Code:
        <html code... >

        Kommentar


        • #5
          PHP-Code:
          echo nl2br(htmlentities($deinString)); 

          Kommentar


          • #6
            Original geschrieben von asp2php
            PHP-Code:
            echo nl2br(htmlentities($deinString)); 
            Nein, denn dann wird sein html code ja nicht mehr interpretiert.

            Kommentar


            • #7
              okay, danke für die schnelle Antwort, werde es mit explode versuchen!

              Kommentar


              • #8
                Original geschrieben von OliOli
                Nein, denn dann wird sein html code ja nicht mehr interpretiert.
                IMHO er will die HTML-Code nicht ausführen, sondern als Element seiner Dokument behandeln

                Kommentar


                • #9
                  Hallo Zusammen,

                  ich würde das Thema gerne noch einmal hoch holen, da ich auch dieses Problem habe. Genau so, wie beschrieben!

                  Mit explode() komme ich auch nicht wirklich weiter, da in den Texten aus der DB z.B. mehrere Tabellen vorkommen. Da werde ich mit explode nicht wirklich froh:

                  - nach "<table" exploden
                  - in jedem zweiten Element nach "</table" exploden
                  - dann das Ganze gemischt wieder zusammenstöpseln mit nl2br bzw. plain...

                  geht das nicht irgendwie einfacher?
                  *** Lebe jeden Tag, als wenn es Dein letzter wäre ***

                  Kommentar


                  • #10
                    Mmmmmh, wollte gerade eh mal etwas entspannen, meine Webseite raubt mit die letzten Nerven.
                    Vielleicht ist das ein Ansatz ... oder ich mach mich lächerlich ;-):

                    PHP-Code:
                    <?php
                    function entferneallezeilenumbruecheabernurausTabellen ($daten_aus_der_DB){

                        
                    $die_hoffentlich_richtige_ausgabe '';
                        
                    $input_string $daten_aus_der_DB// ...

                        // alle Tabellen rausziehen und in Array speichern
                        
                    $ausdruck '/<table.*table>/iU';
                    /* ... mit dem RegEx bin ich noch nicht ganz zufrieden .. [^ >]* am 
                    Ende vielleicht besser (sonst hört die Suche auf ...)*/

                        
                    preg_match_all ($ausdruck$input_string$alle_tabellen_arrPREG_PATTERN_ORDER);

                        
                    //aus dem String die Tabellen rausziehen und durch $ersatz ersetzen
                        
                    $ersatz '_gutentagichbinderplatzhalter_';
                        
                    $input_string preg_replace($ausdruck,$ersatz,$input_string);
                    //$ausdruck sollte hier passen so wie oben steht

                        //jetzt kommt der wichtigste Teil
                        
                    foreach($alle_tabellen_arr as $eine_tabelle_ausm_array){
                          
                    $ausdruck    '/\r\n|\r|\n/';//Zeilenumbruch entfernen
                          
                    $ersatz '';
                          
                    $eine_tabelle_ohne_zeilenumbruchpreg_replace($ausdruck,$ersatz,$eine_tabelle_ausm_array);

                        
                    $die_hoffentlich_richtige_ausgabe .=
                        
                    preg_replace('_gutentagichbinderplatzhalter_'$eine_tabelle_ohne_zeilenumbruch,$input_string);
                        }
                        
                        return 
                    nl2br ($die_hoffentlich_richtige_ausgabe); 
                    }

                    ?>
                    ... ungetestet!!!!!!!!!!!!!!

                    Gruß php_fusel
                    Zuletzt geändert von php_fussel; 24.01.2009, 12:27.

                    Kommentar


                    • #11
                      @php_fussel: Genau so! Aber anders! ;-)
                      Nein, im Ernst: "Eigentlich" wollte ich schon den Text aus der DB mit nl2br ausgeben, nur eben die Tabellen nicht, da ein "br" innerhalb der Tabellenstrunktur, Leerzeilen nach der Tabelle erzeugt.

                      Dein Vorschlag war super, hat mich auf den richtigen Weg gebracht. Ich habe das noch mal ein wenig umgebastelt:

                      PHP-Code:
                      function nl2br_woTables ($daten_aus_der_DB)
                      {
                          
                      $input_string $daten_aus_der_DB;

                          
                      $ausdruck '~<table.*/table>~isU';

                          
                      preg_match_all ($ausdruck$input_string$alle_tabellen_arrPREG_PATTERN_ORDER);

                          
                      $ersatz '_gtibdph_';
                          
                      $input_string preg_replace($ausdruck,$ersatz,$input_string);
                          
                      $input_string nl2br($input_string);
                          
                          
                      $anz count($alle_tabellen_arr[0]);
                          for (
                      $i 0$i <= ($anz-1); $i++)
                          {
                              
                      $input_string 
                              
                      preg_replace('/_gtibdph_/',$alle_tabellen_arr[0][$i],$input_string,1);
                          }
                          return(
                      $input_string);

                      Gruß, Car
                      *** Lebe jeden Tag, als wenn es Dein letzter wäre ***

                      Kommentar


                      • #12
                        Hallo zusammen,

                        gelöscht...
                        Zuletzt geändert von minou; 29.01.2009, 08:09.

                        Kommentar


                        • #13
                          Original geschrieben von minou
                          Hallo zusammen,

                          warum denn so umständlich, ....
                          ... weils schxxxxe Aussieht. Z.B.

                          PHP-Code:
                          <?php

                          $tabellentext 
                          '
                          Hier steht meine Tabelle:
                          <table border="1" cellpadding="0" cellspacing="0">
                          <tr>
                            <td>
                                Hier steht der Tabellentext
                                
                                Es sind 3 Zeilen (eine davon leer).
                            </td>
                          </tr>
                          </table>
                          Das war die erste Tabelle.
                          :-)
                          Hier kommt die zweite:
                          <table border="1" cellpadding="0" cellspacing="0">
                          <tr>
                            <td>
                                Das ist jetzt die zweite Tabelle!
                            </td>
                            <td>
                                Hier gibt es auch 2 td`s
                            </td>
                          </tr>
                          </table>
                          Das war die zweite Tabelle
                          '
                          ;

                          ?>

                          <pre>
                          <?php echo nl2br ($tabellentext); ?>
                          </pre>
                          Darum der Aufwand ;-)

                          Gruß, Car
                          *** Lebe jeden Tag, als wenn es Dein letzter wäre ***

                          Kommentar


                          • #14
                            Freut mich, wenn ich Dir einen Ansatz geben konnte. Aber mich interessiert schon , ob es im Test auch ordentlich funktioniert hat ...

                            edit war hier: Der Limiter ('1') von preg_replace in der For-Schleife ist wichtig, wohl wahr ... meine Version mit dem 'Anhängen' (.=) war natürlich Käse. Erst dachte ich, der String würde sich immer wieder selber überschreiben ... das tut er auch, aber bei jedem Durchlauf wird dann der nächste Platzhalter durch die entsprechende Tabelle ersetzt ...
                            Zuletzt geändert von php_fussel; 26.01.2009, 17:12.

                            Kommentar


                            • #15
                              Servus php_fussel,

                              es funktioniert mit meiner geposteten "nl2br_woTables" ganz gut. Es war ja auch von Deiner Version nicht mehr viel, bis zu dem Ergebnis, dass ich haben wollte. Manchmal braucht man eben nur den richtigen Schubs! ;-)

                              Mal die Änderungen im Detail:
                              - bei der regexp-Suche habe ich einen anderen Delimiter gewählt (=Gewohnheit) und um den Modifier "s" erweitert.
                              - den Platzhalter habe ich halt nur verkürzt :-o
                              - nl2br habe ich dann auf den String mit Platzhalter angewendet und hinterher alles wieder mit
                              - preg_replace zusammengesetzt. Dabei musste ich allerdings (kapier ich noch nicht) ein "/" am Anfang und Ende einbauen, sonst hätte er mir die öffnende Klammer "<" vom "<table" und das "t" von "/table>" stehen lassen!?
                              - ja genau: das mit dem Anhängen war nix ;-)
                              - und das übergebene Array in preg_replace (ist ja mehrdimensional) mochte er nicht auf Anhieb!

                              Kannst ja meinen geposteten "$tabellentext" mal durch die Funktion jagen!

                              Im übrigen kann man die Funktion innerhalb der FOR-Schleife auch dahingehend erweitern, jede Tabelle nochmal auf TDs zu durchsuchen und dort wieder nl2br drüber laufen zu lassen, dann ist der Text innerhalb der Tabelle auch schön! ;-)

                              Nochmals Danke und Gruß, Car

                              edit: Bei viel Zeit und Lust werde ich mich an eine Version für geschachtelte Tabellen machen... Die poste ich dann auch mal!
                              Zuletzt geändert von CarShaker; 26.01.2009, 16:22.
                              *** Lebe jeden Tag, als wenn es Dein letzter wäre ***

                              Kommentar

                              Lädt...
                              X