Ankündigung

Einklappen
Keine Ankündigung bisher.

BBCode Realisierung - Code

Einklappen

Neue Werbung 2019

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

  • BBCode Realisierung - Code

    Moin

    Also ich hab mein BBCode System jetzt eigentlcih komplett fertig, bis auf die Implementierung von [code].

    Das Problem ist ja jetzt eigentlcih nur, dass ich nachdem ich [code] ersetzt habe usw. verhindern muss, dass zwischen den code-tags noch nach BBCodes oder Smilies gesucht wird.

    Also meine Ideen waren folgende:

    1. Ich zerlege den Text in Stücke mit- und ohne-BBCOde und füge sie hinterher wieder zusammen. -> Scheint mir aber uneffektiv
    2. Ich mach ne Callback funktion rein, in der ich alle BBCode suche und einfache ungültig mache, so dass sie nciht mehr ersetzt werden, wenn dann nachher der ganze Text durchkämmt wird.
    Ich werde wohl die 2. machen. Allerdings weiß ich noch nciht so recht, wie ich die Tags ungültig machen soll .... Die [ könnte ich vielleicht über den direkte Ascii adressierung den BBCode "Scannern" entziehen, aber wie ich dafür sorgen soll, dass evtl. Smilies nciht ersetzt werden, weiß ich beim besten Willen nicht. Irgendwie laufen meine meine Überlegungen alle darauf hinaus, dass der Text zwischen [code] zwingend nciht in die restliche Bearbeitung darf.

    Wie habt ihr dass denn gelöst?

    Andun

    PS.: Ja, nächstes mal, mache ich vorher eine richtige Modellierung und programmiere nciht einfach drauf los. Ich dachte nciht, dass das hier so kompliziert wird.


  • #2
    Wäre es zuvor nicht sinniger? Weil dann könntes du mit n RegEx der den Text Außerhalb der Code Tags matcht ... das ganze müsste allerdings rekursiv sein es sei du gehst davon aus es gibt nur einen Code Bereich im Text
    Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

    Kommentar


    • #3
      Moin

      Danke schonmal für die Antwort, aber könntest du das mit der Rekursiven Anweisung nochmal erklären?
      Meinst du, ich soll also verneint auf [code] usw testen? Falls du das meinst, kannst du das etwas weiter ausführen, da ich da grade echt nen Knoten im Hirn hab.

      Danke

      Andun

      Kommentar


      • #4
        Sorry wenn ich völlig in die falsche Richtung schiesse.

        htmlspecialchars sollte doch eigentlich reichen für [code] tags?

        Kommentar


        • #5
          Zitat von -tanK-
          htmlspecialchars sollte doch eigentlich reichen für [code] tags?
          Da kann ich dir nicht folgen. Wofür sollte htmlspecialchars() bei dem speziellen Problem weiterhelfen?

          Kommentar


          • #6
            Zitat von Andun
            Moin

            Danke schonmal für die Antwort, aber könntest du das mit der Rekursiven Anweisung nochmal erklären?
            als Beispiel:

            Code:
            <?
            $text = "
                
                
                
            
            
            Code:
            b + a
            Hallo Welt1
            Code:
            a + b
            Hallo Welt2"; BBCode($text); function BBCode($text) { preg_match("/^(.*?)\[code\].*?\[\/code\](.*?)$/u", $text, $treffer); if (count($treffer) == 3) { echo "<pre>"; print_r($treffer); echo "</pre>"; if (!empty($treffer[1])) BBCode($treffer[1]); if (!empty($treffer[2])) BBCode($treffer[2]); } } ?>
            Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

            Kommentar


            • #7
              Moin

              Danke erstmal. Jetzt versteh ich überhaupt erst was du meinst ...

              Das einzige Problem, was ich noch mit deinem Code habe, ist, dass du ja nirgends wieder alles zusammen setzt.
              Mit print_r($treffer); gibst du ja wieder alles aus. Das ist ja nciht gewünscht. Jetzt wo ich aber das Prinzip kapiert habe, bastle ich es mal.

              Ich schreib dann hier auch den Code, falls wieder mal jemand das Problem hat.

              Danke

              Andun

              Kommentar


              • #8
                print_r ist ja auch nur für Developer sinnvoll ("Gibt Variablen-Informationen in lesbarer Form aus") und war von ihm wohl auch nur ein Beispiel.

                Kommentar


                • #9
                  richtig das war nur um dir zu zeigen wie man sowas machen ... aber das ganze fertigstellen musst schon selbst...

                  Du kannst jetzt hingehen und kannst deinen Smilie-Parser drüberlaufen lassen.
                  Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

                  Kommentar


                  • #10
                    Zitat von Andun
                    Ich schreib dann hier auch den Code, falls wieder mal jemand das Problem hat.
                    vielleicht hilft dir ja eine rekursive methode aus meiner templateklasse dabei weiter. ich denke, dein problem ist artverwandt.
                    ich suche nach bestimmten block-pattern, erzeuge dann eine neue instanz und die methode loadString() ruft dann rekursiv wieder _extractBlocks() auf:

                    PHP-Code:
                      /**
                       * Builds the template object tree of (nested) blocks, if exists.
                       *
                       * Replaces all matches of search pattern ($block_regex) in template
                                * content with 'block_name' embedded in left and right delimiters.
                       * Creates new class instance(s) with given html content(s) of search pattern.
                       * This works recursive, if sub template object(s) contains nested block(s).
                       */
                            
                    private function _extractBlocks()
                             {
                              
                    // This regular expression matches block syntax:
                        // html content
                              
                    $block_regex='|(.*)|s';
                              
                              if(
                    preg_match_all($block_regex$this->content$matches))
                               {
                                
                    $class_name=get_class($this);

                                      for(
                    $i=0$i<count($matches[0]); $i++)
                                       {
                                     
                    // matches[0][$i] contains the full pattern matched.
                                     // matches[1][$i] contains the template variable/block name.
                                     // matches[2][$i] contains the html content.
                                     
                    $search=$matches[0][$i];
                                     
                    $replace=$this->left_delimiter.$matches[1][$i].$this->right_delimiter;
                                     
                    $this->content=str_replace($search$replace$this->content);

                                  
                    $this->blocks[$matches[1][$i]]=new $class_name();
                                  
                    $this->blocks[$matches[1][$i]]->loadString($matches[2][$i]);
                                       }
                               }
                             } 

                    Kommentar


                    • #11
                      Moin

                      Also ich habe das ganze jetzt voll endet und so funktioniert es auch. Hier ist mal der Code:

                      PHP-Code:
                      function bbcode($text$relPfad="") {
                      //Zuerst nach [code]...[/code] Sektionen suchen, damit dieses nicht behandelt werden.
                      $text code($text$relPfad);
                      return 
                      $text;
                      }

                      function 
                      code($origText$relPfad=""){
                      preg_match("!^(.*)\[code\](.*)\[/code\]([\r\n][\r\n]|[\r\n]|)(.*)$!isU"$origText$treffer);
                      if (
                      count($treffer) == 5)
                         {
                              if (!empty(
                      $treffer[1]))
                            
                      $text code($treffer[1]);

                             
                      $text .= replace_code($treffer[2]);

                            if (!empty(
                      $treffer[4]))
                            
                      $text .= code($treffer[4]);
                         }
                      elseif (
                      count($treffer==0)) {
                          return 
                      replace_bbcode($origText$relPfad);
                          }
                      return 
                      $text;
                      }

                      //-----------------------------------------------
                      //Das [code] Tag bearbeiten
                      function replace_code($text) {
                          
                      $text str_replace("  "" "$text);
                          
                      $text str_replace("  "" "$text);
                          
                      $text str_replace("\t"" "$text);
                          
                      $text preg_replace("/^ {1}/m"''$text);
                          
                      $text preg_replace('!\\n!isU','
                      '
                      ,$text);
                          
                      $text stripslashes($text);
                          
                      $text '<div class="code">'.$text.'</div>';
                          return 
                      $text;
                      }

                      //-----------------------------------------------
                      //Alle BBCodes ersetzen
                      function replace_bbcode($text$relPfad="") {
                      ...... 
                      Die letzte Funktion lass ich mal offen, da ich denke, dass findet man schon zu hauf im Netz und außerdem muss ich ja nicht meine komplette Arbeit offen legen.

                      Und die Funktion ist aber eigentlcih selbsterklärend:

                      code() bekommt den Text und zerlegt in Teile vor/drinnen/hinter den [ code ] tags. Davor und dahinter werden nochmal nach in code() eingeschleußt um zu überprüfen, ob noch weitere [ code ] tags da sind. Falls nicht, kommt der Text mit übersetzen BBCodes wieder und wird wieder zusammen gesetzen.

                      Viel Spaß damit

                      Andun

                      Kommentar

                      Lädt...
                      X