Ankündigung

Einklappen
Keine Ankündigung bisher.

[PHP/BBCode] nl2br nur bedingt anwenden

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

  • [PHP/BBCode] nl2br nur bedingt anwenden

    Hallo,
    ich bin gerade im Aufbau einer Informationsdatenbank, um die Informationen möglichst Zeiteffizient eingeben zu können, dachte ich an eine Art Editor im Browser, also habe ich ein Formular erstellt (zum testen ersteinmal eine normale Textarea) in dem Daten eingegeben werden können und in einer Datenbank gespeichert werden... Testweise werden die Daten derzeitig noch nicht gespeichert, sonder direkt über eine PHP-Funktion bzgl. BBCode abgeändert und direkt ausgegeben. Bringt mir nichts, wenn die Daten falsch in der Datenbank gespeichert werden... Also nun zu meinem Problem ich habe in meiner Funktion unter anderem die "BBCode-Standard-Komponenten" [b][i][u][color] aber auch eigene Komponenten wie [h1][h2][h3][list][*] usw. die Umsetzung funktioniert auch soweit recht sauber. Um nun einen Zeilenumbruch zu realisieren (letztlich soll das ganze ja so ausgegeben werden, wie ich es eingegeben habt, arbeite ich in meiner Funktion recht weit am Anfang mit der Funktion nl2br. Und da kommt es zu meinem Problem, h1/h2 usw. erzeugen ja einen eigenen Zeilenumbruch auch ohne <br> aber, nach einer Überschrift schreibt man ja i.d.R. in der nächsten Zeile weiter, sprich mache ich noch einen manuellen Zeilenumbruch (per Entertaste) in meinem Formular, wenn dies nun durch meine PHP-Funktion läuft, setzt es natürlich wg. nl2br noch einmal hinter mein <h1></h1> ein <br> und das sorgt natürlich für eine relativ große lücke, die sich vielleicht noch per css auf den h1-tag verhindern lässt, aber auch list / * bzw. ul/li erzeugen ja auch einen Zeilenumbruch und das sieht sehr unschön aus, wenn in einer aufzählung ständig so große Lücken sind. Also, wie kann ich diese unnötigen Zeilenumbrüche verhindern bzw. bei gewissen tags die <br>'s wieder herauslöschen (ist dies ohne weiteres Möglich?).

    Ich hoffe, dass mein Problem ausführlich beschrieben ist und mir einer von euch weiterhelfen kann.

    Vielen Dank für eure Hilfe.


  • #2
    Benutz doch einen der zahlreichen wysiwyg Editoren und validier den Input mit HTMLPurifier.

    Hier ne kleine Auwahl:
    • wymeditor
    • ckeditor
    • fckeditor
    • tinymce

    grüße


    Basti
    I like cooking my family and my pets.
    Use commas. Don't be a psycho.
    Blog - CoverflowJS

    Kommentar


    • #3
      hmmm... wysiwyg ist nicht so meine art :-/... Ich mache das um meine Programmierkenntnisse in PHP etwas zu erweitern und möchte das schon durch reine Programmierung erreichen. Mein Ziel ist es das Problem zu lösen indem ich das verstehe, was das Programm (bzw. das Script) macht.

      Hier einmal meine beiden Dateien im Quelltext:

      index.htm
      PHP-Code:
      <table>
        <
      tr>
          <
      td>
            <
      form action="ausgabe.php" method="post">
              <
      table>
                <
      tr>
                  <
      td valign="top">Inhalt:</td>
                  <
      td valign="top"><textarea name="inhalt" cols="50" rows="20"></textarea></td>
                </
      tr>
              </
      table>
              <
      input type="submit" value="Prüfen">
            </
      form>
          </
      td>
          <
      td valign="top">
            [
      b]Fett[/b]<br>
            [
      i]Kursiv[/i]<br>
            [
      u]Unterstrichen[/u]<br>[list]<br>[*]Eintrag 1[/*]<br>[*]Eintrag 2[/*]<br>[/list]<br>
            [color=rot]Rot[/color]<br>
            [color=gelb]Gelb[/color]<br>
            [color=blau]Blau[/color]<br>
            [color=grün]Grün[/color]<br>
            [color=hellgrün]Hellgrün[/color]<br>
            [color=braun]Braun[/color]<br>
            [h1]Überschrift 1[/h1]<br>
            [h2]Überschrift 2[/h2]<br>
            [h3]Überschrift 3[/h3]
          </td>
        </tr>
      </table> 
      ausgabe.php
      PHP-Code:
      <?
        if ( $_POST['inhalt'] <> "")
          {
            $inhalt = $_POST['inhalt'];
            $inhalt = htmlspecialchars($inhalt);
            $inhalt = nl2br($inhalt);
            $inhalt = stripslashes($inhalt);
            $inhalt = preg_replace('=\[b\](.*)\[/b\]=Uis', 
              '<span style="font-weight:bold;">\1</span>',
              $inhalt);
            $inhalt = preg_replace('=\[i\](.*)\[/i\]=Uis',
              '<span style="font-style:italic;">\1</span>',
              $inhalt);
            $inhalt = preg_replace('=\[u\](.*)\[/u\]=Uis',
              '<span style="text-decoration:underline;">\1</span>',
              $inhalt);
            $inhalt = preg_replace('=\[marker\](.*)\[/marker\]=Uis',
              '<span style="background-color: yellow; font-style:italic;">\1</span>',
              $inhalt);
            $inhalt = preg_replace('=\[list\](.*)\[/list\]=Uis',
              '<ul>\1</ul>',
              $inhalt);
            $inhalt = preg_replace('=\[\*\](.*)\[/\*\]=Uis',
              '<li>\1</li>',
              $inhalt);
            $inhalt = preg_replace('=\[color\=rot](.*)\[/color\]=Uis',
              '<font color="red">\1</font>',
              $inhalt);
            $inhalt = preg_replace('=\[color\=gelb](.*)\[/color\]=Uis',
              '<font color="yellow">\1</font>',
              $inhalt);
            $inhalt = preg_replace('=\[color\=blau](.*)\[/color\]=Uis',
              '<font color="blue">\1</font>',
              $inhalt);
            $inhalt = preg_replace('=\[color\=grün](.*)\[/color\]=Uis',
              '<font color="green">\1</font>',
              $inhalt);
            $inhalt = preg_replace('=\[color\=hellgrün](.*)\[/color\]=Uis',
              '<font color="lime">\1</font>',
              $inhalt);
            $inhalt = preg_replace('=\[color\=braun](.*)\[/color\]=Uis',
              '<font color="brown">\1</font>',
              $inhalt);
            $inhalt = preg_replace('=\[h1](.*)\[/h1\]=Uis',
              '<h1>\1</h1>',
              $inhalt);
            $inhalt = preg_replace('=\[h2](.*)\[/h2\]=Uis',
              '<h2>\1</h2>',
              $inhalt);
            $inhalt = preg_replace('=\[h3](.*)\[/h3\]=Uis',
              '<h3>\1</h3>',
              $inhalt);
              echo $inhalt;
            exit;
         }
      ?>
      Wenn man nun in das Formular folgendes eingibt:
      Code:
      • Eintrag 1[/*]
      • Eintrag 2[/*]
      dann sieht man vielleicht was ich meine.

      Trotz alledem schonmal danke für den Tipp Basti.

      Kommentar


      • #4
        Reguläre Ausdrücke sind der falsche Ansatz für BBCode. Sobald Du mehrfach verschachtelte Codes hast, fährt das gegen die Wand. Du wirst hier um einen kleinen Parser oder zumindest nen Lexer nicht herum kommen.

        Gruß Jens

        Kommentar


        • #5
          Sorry, wegen dem Doppelposting, eigentlich wollte ich es nur abändern, also in das Formular bitte folgendes eingeben:
          [lista] | [*]Eintrag 1[/*] | [*]Eintrag 2[/*] | [/lista] |

          (das lista ist wieder durch list zu ersetzen... die | sollen einen Zeilenumbruch darstellen, funktioniert hier im Forum leider nicht.)

          Kommentar


          • #6
            Dann musst du dir alle Elemente "rausholen", die einen Block bedingen.[MAN]preg_split[/MAN] könnte dir hier weiterhelfen.
            I like cooking my family and my pets.
            Use commas. Don't be a psycho.
            Blog - CoverflowJS

            Kommentar


            • #7
              Zitat von Jens Clasen Beitrag anzeigen
              Reguläre Ausdrücke sind der falsche Ansatz für BBCode. Sobald Du mehrfach verschachtelte Codes hast, fährt das gegen die Wand. Du wirst hier um einen kleinen Parser oder zumindest nen Lexer nicht herum kommen.

              Gruß Jens
              Wie meinst du das mit mehrfach verschachtelt?

              PHP-Code:
              [i][u][b]Kursiv-Unterstrichen-Fett[/b][/u][/i
              solltest du das meinen, das funktioniert... Habe eben nur das Problem mit dem Zeilenumbruch in h1, h2, h3 und in den List-Tags.

              Kommentar


              • #8
                Zitat von rudygotya Beitrag anzeigen
                Dann musst du dir alle Elemente "rausholen", die einen Block bedingen.[MAN]preg_split[/MAN] könnte dir hier weiterhelfen.
                Dann soll ich den kompletten ausdruck rausholen und später wieder einfügen? Sprich Textteile extrahieren, Platzhalter setzen und später nach nl2br wieder einfügen? Das müsste doch auch einfacher zu machen sein . Gibts nicht einfach einen Parameter den ich angeben kann? Irgendwie kommt es mir so vor als wäre die Lösung so einfach, dass man sie nur nicht sieht ...

                Vielen Dank für eure Hilfe bisher... wäre schön, wenn wir noch ne gemeinsame Lösung finden.

                Kommentar


                • #9
                  Wie wäre es mit sowas hier:

                  [QUOTE=Kritiker82]
                  [QUOTE=Jens Clasen]
                  Reguläre Ausdrücke sind der falsche Ansatz für BBCode. Sobald Du mehrfach verschachtelte Codes hast, fährt das gegen die Wand. Du wirst hier um einen kleinen Parser oder zumindest nen Lexer nicht herum kommen.

                  Gruß Jens[/quote]
                  Wie meinst du das mit mehrfach verschachtelt? [/quote]

                  Alternativ gilt aber auch jedes paar Tags, wo der innere und der äußere Teil durch unterschiedliche Behandlungsmethoden müssen.

                  Gruß Jens

                  Kommentar


                  • #10
                    Also mein Lösungsansatz sieht nun so aus, es erfüllt derzeitig meinen Erwartungen... ich habe nun einach die eventualitäten mit nl2br mit eingearbeitet in die Funktion, das mit der mehrfachverschachtelung läuft soweit sehr gut, im moment sehe ich kein wirkliches Problem auf meinem gwünschten Einsatzzweck. Ich denke vorerst reicht mir das ganze aus und es erfüllt den von mir gewünschten Zweck. Ich danke euch vielmals für eure Hilfe.

                    Hier mein Lösungsvorschlag:
                    PHP-Code:
                    <?
                      if ( $_POST['inhalt'] <> "")
                        {
                          $inhalt = $_POST['inhalt'];
                          $inhalt = htmlspecialchars($inhalt);
                          $inhalt = nl2br($inhalt);
                          $inhalt = stripslashes($inhalt);
                          $inhalt = preg_replace('=\[b\](.*)\[/b\]=Uis', 
                            '<span style="font-weight:bold;">\1</span>',
                            $inhalt);
                          $inhalt = preg_replace('=\[i\](.*)\[/i\]=Uis',
                            '<span style="font-style:italic;">\1</span>',
                            $inhalt);
                          $inhalt = preg_replace('=\[u\](.*)\[/u\]=Uis',
                            '<span style="text-decoration:underline;">\1</span>',
                            $inhalt);
                          $inhalt = preg_replace('=\[marker\](.*)\[/marker\]=Uis',
                            '<span style="background-color: yellow; font-style:italic;">\1</span>',
                            $inhalt);
                          $inhalt = preg_replace('=\[list\]<br />(.*)\[/list\]<br />=Uis',
                            '<ul>\1</ul>',
                            $inhalt);
                          $inhalt = preg_replace('=\[\*\](.*)\[/\*\]<br />=Uis',
                            '<li>\1</li>',
                            $inhalt);
                          $inhalt = preg_replace('=\[color\=rot](.*)\[/color\]=Uis',
                            '<font color="red">\1</font>',
                            $inhalt);
                          $inhalt = preg_replace('=\[color\=gelb](.*)\[/color\]=Uis',
                            '<font color="yellow">\1</font>',
                            $inhalt);
                          $inhalt = preg_replace('=\[color\=blau](.*)\[/color\]=Uis',
                            '<font color="blue">\1</font>',
                            $inhalt);
                          $inhalt = preg_replace('=\[color\=grün](.*)\[/color\]=Uis',
                            '<font color="green">\1</font>',
                            $inhalt);
                          $inhalt = preg_replace('=\[color\=hellgrün](.*)\[/color\]=Uis',
                            '<font color="lime">\1</font>',
                            $inhalt);
                          $inhalt = preg_replace('=\[color\=braun](.*)\[/color\]=Uis',
                            '<font color="brown">\1</font>',
                            $inhalt);
                          $inhalt = preg_replace('=\[h1](.*)\[/h1\]<br />=Uis',
                            '<h1>\1</h1>',
                            $inhalt);
                          $inhalt = preg_replace('=\[h2](.*)\[/h2\]<br />=Uis',
                            '<h2>\1</h2>',
                            $inhalt);
                          $inhalt = preg_replace('=\[h3](.*)\[/h3\]=Uis',
                            '<h3>\1</h3>',
                            $inhalt);
                          $inhalt = preg_replace('=\[h1](.*)\[/h1\]=Uis',
                            '<h1>\1</h1>',
                            $inhalt);
                          $inhalt = preg_replace('=\[h2](.*)\[/h2\]=Uis',
                            '<h2>\1</h2>',
                            $inhalt);
                          $inhalt = preg_replace('=\[h3](.*)\[/h3\]=Uis',
                            '<h3>\1</h3>',
                            $inhalt);
                          $inhalt = preg_replace('=\[list\]<br />(.*)\[/list\]=Uis',
                            '<ul>\1</ul>',
                            $inhalt);
                          $inhalt = preg_replace('=\[\*\](.*)\[/\*\]=Uis',
                            '<li>\1</li>',
                            $inhalt);
                            echo $inhalt;
                          exit;
                       }
                    ?>

                    Kommentar


                    • #11
                      Zitat von Jens Clasen Beitrag anzeigen
                      Reguläre Ausdrücke sind der falsche Ansatz für BBCode. Sobald Du mehrfach verschachtelte Codes hast, fährt das gegen die Wand. Du wirst hier um einen kleinen Parser oder zumindest nen Lexer nicht herum kommen.

                      Gruß Jens
                      Diese Aussage ist einfach gesagt Quatsch. Natürlich kannst du BB-Code mit regulären Ausdrücken abhandeln auch mit verschachtelten BB-Codes.

                      Dazu nehme man einfach preg_replace_callback. Dazu ist zwar dann eine seperate Funktion nötig, aber geht wunderbar.
                      Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                      http://www.lit-web.de

                      Kommentar


                      • #12
                        Zu deinem Problem: Ich würde die Eingabe normal mit bbCode parsen und anschließend alle Fälle von </h*><br/> durch </h*> ersetzen, wenn du wirklich das Problem so angehen willst!

                        Ich würde aber zu folgendem CSS Style mit Überschriften raten, dann ersparst du dir diese Vorgaben:
                        Code:
                        h1, h2, h3, h4, h5 { display: inline; }
                        Außerdem solltest du dir nochmal die regulären Ausdrücke inklusive dem Unterpunkt Rückwärtsreferenz genauer ansehen, sodass du die Zeilen Code stark komprimieren kannst!

                        Kommentar


                        • #13
                          Zitat von litterauspirna Beitrag anzeigen
                          Diese Aussage ist einfach gesagt Quatsch. Natürlich kannst du BB-Code mit regulären Ausdrücken abhandeln auch mit verschachtelten BB-Codes.
                          Können kannst Du vieles - die Frage ist nur, ob das auch schlau ist. Wenn Du jetzt nicht grade von einem Ausdruck wie
                          Code:
                          #((\[[^\]]+\])|(.*?))#s
                          redest, dann halt ich Deine Aussage da - mit Verlaub - für Quatsch. (und das auch nur, wenn Dein BBCode explizit keine Parametrisierten Tags verarbeiten können soll)

                          Die einzige Möglichkeit, veschachtelte Ausdrücke mittels regulärer Ausdrücke zu lösen, wären Rekursionen innerhalb der Callbacks. Dabei machst Du Dir aber das Leben unnötig schwer, sobald bestimmte Tags vom Vorhanden-Sein bestimmter anderer, äußerer Tags abhängen. Verschachtelte Listen wären da ein gutes Beispiel.

                          Sicherlich - Du kannst ne ganze Zeit lang gegen alle möglichen auftretenden Probleme gegen an programmieren. Sinnvoll ist das nur nicht, weil Du irgendwann eben doch gegen die Wand fährst.

                          Gruß Jens

                          Kommentar


                          • #14
                            Ich würde auch zu einem fertigen bbCode-Parser raten und den ggf. abändern oder das Ergebnis nachparsen.
                            --

                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                            --

                            Kommentar

                            Lädt...
                            X