Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] BBcode mit regex - Problem bei Zeilenumbrüchen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] BBcode mit regex - Problem bei Zeilenumbrüchen

    Hallo erstmal.
    Ich hab schon ne weile gesucht, probiert und auch google bemüht und so weiter, finde aber meinen Fehler nicht.

    Ich möchte BBCode in html konvertieren und hab dafür (stellvertretend für alles andere, wo es auch nicht geht) folgenden Quelltext für fette Schrift:

    Code:
    $text = preg_replace("/\[b\](.*?)\[\/b\]/s", "<b>$1</b>", $text;)
    Zur Situation:

    Ich speichere Text über ein Textfeld in einer Datei (auch geplant füz mysql, die "Infrastruktur" steht schon). Diese Datei lese ich aus und will den Inhalt formatiert auf meiner Webseite ausgeben.
    Das funktioniert alles auch ganz gut, doch wird ein Zeilenumbruch innerhalb des Tags eingegeben, wird der BBCode nicht mehr umgewandelt.
    Jetzt wüsste ich gerne, was ich dagegen machen kann.

    Danke schonmal für die Mühe
    LG Peter

  • #2
    Jetzt wüsste ich gerne, was ich dagegen machen kann.
    Den Zeilenumbruch auch erfassen? . matcht im Normalfall eben nicht alle Zeichen.
    [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


    • #3
      Ich hab öfter gelesen, dass mit Modifikator s der Punkt auch den Zeilenumbruch erfasst. Nur leider funktioniert das nicht, zumindest bekomme ich nicht das gewünschte Ergebnis.
      Könntest du eine mögliche Lösung oder Alternative posten?

      Kommentar


      • #4
        Ich kann dein Problem nicht nachvollziehen - der gezeigte Ausdruck ersetzt in meinem Test wohl ein- als auch mehrzeilige Testausdrücke.


        (Dass reguläre Ausdrücke kaum ausreichen, um einen BBCode-Parser zu basteln, der auch die Einhaltung vorgebener Verschachtelungsregeln ermöglicht, brauche ich jetzt wohl nicht noch mal wiederholen.)
        [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

        Kommentar


        • #5
          brauche ich jetzt wohl nicht noch mal wiederholen
          Da kennst Du das Board aber schlecht! Man darf hier Sachen wiederholen bis zum Sankt Nimmerlein. Weil das nämlich viel einfacher für den Fragenden ist, als auch nur mal 10 Minuten nach anderen Threads zum Thema zu suchen.
          [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


          • #6
            Ich verspüre ironische Schwingungen...

            Aber stimmt schon,
            das hätte er sicher mit etwas nachdenken schaffen können.
            Competence-Center -> Enjoy the Informatrix
            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

            Kommentar


            • #7
              Hallo.
              Ich hab den Ausdruck nun auch erfolgreich getestet. (Danke für den Hinweis)
              Das Problem liegt also offensichtlich an anderer Stelle.

              Den Code zum Ersetzen hab ich in einer eigenen Datei gespeichert.
              Binde ich diese vor dem Abspeichern des Textes ein, wird der Text korrekt umgewandelt. Binde ich diese aber erst nach dem Auslesen der Datei ein, dann entsteht besagtes Problem.

              Zum Auslesen des Textes nutze ich fgets(); und zum speichern fwrite();
              Nun weiß ich nicht, ob diese Funktionen derartige Auswirkungen haben können, was mir aber im Grunde als sinnlos erscheint.


              @Arne
              Google hab ich schon benutzt. Bin da auch auf christian-seiler.de gestoßen, wo man eine scheinbar recht gute Parserklasse findet. Dennoch wollte ich gerne wissen, wo mein Fehler liegt und auch sehen, in wie weit ich das selbst realisieren kann. Dabei kann man ja auch einiges lernen.
              Wenn ich einfach code zusammenkopiere, ohne diesen zu verstehen, hab ich vielleicht eine bequeme Lösung, aber nichts gekonnt. Selbst etwas zu schaffen, auch wenn es mühsamer ist und mehr Zeit in Anspruch nimmt, finde ich daher reizvoller. Außerdem weiß man dann auch, wo man suchen muss, wenn Fehler auftreten

              Kommentar


              • #8
                Das' zumindest ne gesunde Einstellung, finde ich!
                Competence-Center -> Enjoy the Informatrix
                PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                Kommentar


                • #9
                  Ich-will-das-selbst-schaffen-Attitüde - PHP.de Wiki
                  [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


                  • #10
                    Netter Artikel

                    Ich will ja nicht gleich das Rad neu erfinden. Es ist halt eine Gelegenheit um meinen Horizont zu erweitern. Außerdem denke ich, dass für meine Zwecke ein paar Ersetzungsmuster reichen und ich mich nicht gleich mit einem "Parsermonster" herumschlagen muss (dort muss man ja auch selbst seinen BBCode definieren, glaube ich zumindest gelesen zu haben).

                    Hab jetzt aus der Datei mit Ersetzungsmustern eine Funktion gebastelt und auf der Hauptseite eingebunden. Damit ist sie quasi allgegenwärtig und ich kann sie aufrufen, wo ich sie brauch.

                    Die Ersetzungsmuster funktionieren nach dem Auslesen aus der mysql-Tabelle, aber nach wie vor nur bedingt nach dem Auslesen aus einer Datei.

                    PHP-Code:
                    $fp fopen($content."_include.php","r");
                    if (
                    $fp){

                        while(!
                    feof($fp)){
                            
                    $text fgets($fp);
                            
                    $text nl2br($text);
                            
                    $text bbcode($text);
                            
                            echo
                    $text;
                        }
                        
                    fclose($fp);


                    Ich hab jetzt noch eine Funktion gefunden (bevor ich obiges gesendet hab, lasse das aber trotzdem mal so stehen):

                    PHP-Code:
                    $text file_get_contents($content."_include.php");
                    $text nl2br($text);
                    $text bbcode($text);

                    echo
                    $text
                    Mit dieser Funktion zum Auslesen funktioniert die ganze Sache, das heißt mein Problem ist behoben. Kann mir jemand erklären, warum es mit fgets(); nicht klappt? Das würde mich wirklich noch interessieren.

                    Kommentar


                    • #11
                      Das Problem liegt daran, dass du in oberen Quellcode jede Zeile einzeln mit der Funktion bbcode() bearbeitest. Sobald ein BBCode über zwei oder mehr Zeilen geht, befindet sich das Tag zum Öffnen und zum Schließen nicht in der selben Zeile und wird daher auch nicht vom regulären Ausdruck erfasst!

                      Mit fgets() geht das ganze auch, aber du musst den Text erst "zusammensetzen" und dann parsen:
                      PHP-Code:
                      $fp fopen$content."_include.php""r" );
                      $text '';
                      if( 
                      $fp )
                      {
                          while(!
                      feof($fp))
                          {
                              
                      $text .= fgets$fp );
                          }
                          
                      fclose$fp );

                          
                      $text nl2br$text );
                          
                      $text bbcode$text );
                          echo 
                      $text;

                      Kommentar


                      • #12
                        Daran könnte es liegen
                        Manchmal ist es so einfach...

                        Danke für die Info

                        Kommentar

                        Lädt...
                        X