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

  • Andun
    hat ein Thema erstellt BBCode Realisierung - Code.

    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.

  • Andun
    antwortet
    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

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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]);
                       }
               }
             } 

    Einen Kommentar schreiben:


  • HStev
    antwortet
    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.

    Einen Kommentar schreiben:


  • Zergling-new
    antwortet
    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.

    Einen Kommentar schreiben:


  • Andun
    antwortet
    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

    Einen Kommentar schreiben:


  • HStev
    antwortet
    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]); } } ?>

    Einen Kommentar schreiben:


  • xabbuh
    antwortet
    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?

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Sorry wenn ich völlig in die falsche Richtung schiesse.

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

    Einen Kommentar schreiben:


  • Andun
    antwortet
    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

    Einen Kommentar schreiben:


  • HStev
    antwortet
    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

    Einen Kommentar schreiben:

Lädt...
X