Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 26

Thema: Seb's BB-Code-Parser

  1. #1
    seb
    seb ist offline
    TP-Veteran
    Registriert seit
    Jan 2002
    Beiträge
    1.741

    Seb's BB-Code-Parser

    Gelöst mit nur einem preg_match() für alles Tags (Schleife um die Funktion wird für verschachtelte Tags benötigt) durch Übergabe von Tagname, innerem Text und optionalem Argument an eine Callback-Funktion, die sich um alles übrige kümmert.
    Wenig fehleranfällig (BB-Codes werden nur bei Vorhandensein eines entsprechenden Schließen-Tags verarbeitet) und leicht erweiterbar.

    Unterstützt in dieser Version:
    • Fett
    • Kursiv
    • Unterstrichen
    • Code (dicktengleiche Schrift für Programlistings etc., HTML <pre>-Tag)
    • Textfarbe
    • eMail-Link
    • Bild
    • Textgröße
    • Zitat (wie hier im Forum)
    • URL (normaler Link)
    Angehängte Dateien Angehängte Dateien

  2. #2
    TP-Junior
    Registriert seit
    Mar 2005
    Beiträge
    10

    Question

    hallo !

    ist die datei defeckt ?

    bekomme nur ne weiße seite wenn ich drauf klicke

    mfg boss

  3. #3
    TP-Member Avatar von schubertmedia
    Registriert seit
    Mar 2005
    Beiträge
    31
    Hallo,

    bei mir geht es auch nicht.

    mfg. Nico
    Php Webspace
    Suche Linkpartner für 10 Projekte, bei Interesse einfach eine PM.

  4. #4
    TP-Member
    Registriert seit
    Sep 2004
    Ort
    Odenwald
    Beiträge
    83

    Smile

    => http://www.traum-projekt.com/forum/s...984#post473984

    Zitat Zitat von Robert
    Hallo nochmal,

    ich bitte 2-3 Tage um Geduld ...
    Wir liegen aktuell auf einem externen Server und werden jetzt nicht soviel arbeit in diese temporäre lösung investieren.

    Auf dem alten (dann neuen Server) sollte alles dann wieder gehen ..

    Viele Grüße
    Robert

  5. #5
    TP-Junior
    Registriert seit
    Mar 2005
    Beiträge
    10
    OK

    Ich kann warten danke schön

  6. #6
    TP-Junior
    Registriert seit
    Apr 2006
    Beiträge
    12
    Ich wollte deinen Parser erstmal loben, er arbeitet gut und schnell!

    Dennoch habe ich eine Frage bezüglich . wie kann ich Listenpunkte erzeugen?
    Ich kenne es bisher mit[*] aber das scheint nicht zu funktionieren. Kann mich jemand darüber aufklären?

    hier mal die Klasse:
    PHP-Code:
    case 'LIST':
                
    $replacement =  '<ul><li>' $inner_string '</li></ul>';
                break; 
    Gruß azoo

  7. #7
    TP-Member Avatar von schubertmedia
    Registriert seit
    Mar 2005
    Beiträge
    31
    Hallo,

    ich habe es mit den function gemacht:

    HTML-Code:
    function bb_code($text, $max_l) {
    $url = TRUE; $bb = TRUE;
        /********************************************************************
        *
        *
        * $url -> TRUE, wenn URls automatisch umgewandelt werden sollen
        * $bb -> TRUE, wenn BB-Code umgewandelt werden soll
        *
        * Erklärung:
        * [b] [/b] werden zu <b> und </b>
        * [i] [/i] werden zu <i> und </i>
        * [u] [/u] werden zu <u> und </u>
        * [list][/list]werden zu <ul> und </ul>
        * [list=a][/list]werden zu <ol type="a"> und </ol>
        * [list=1][/list]werden zu <ol type="1"> und </ol>
        *
        *[*]... wird zu <li>...</li>
        * [align=center] [/align] wird zu <div align="center"> und </div>
        *
        * [color=red] [/color] wird zu <font color="red"> und </font>
        *
        * [size=1] [/size] wird zu <font size="1"> und </font>
        *
        * [img] [/img] werden zu <img src="...">
        * [code] [/code] --> siehe Config
        * [php] [/php] --> siehe Config
        * [quote] [/quote] --> siehe Config
        * [url=...]...[/url] wird zu <a href="..." target="_blank">...</a>
        * [email=...]...[/email] wird zu <a href="mailto:...">...</a>
        ********************************************************************/
    
    
        # Config #
          $lword_replace = "<br/>"; // Lange Wörter werden getrennt durch...
    
          // Header und Footer beschreiben, wie...
          // der farbige PHP-Code umschlossen wird
          $header_php = '<br/><br/><div>PHP-CODE:<br/><br/><code>';
          $footer_php = '</code></div><br/>';
    
          // Zitate umschlossen werden
          $header_quote = '<br/><br/><div><i>Zitat:</i><br/>';
          $footer_quote = '</div><br/>';
    
          // normaler code umschlossen wird
          $header_code = '<br/><br/><div>CODE:<br/><br/><pre>';
          $footer_code = '</pre></div><br/>';
        # Ab hier nichts mehr ändern #
    
        #####################################################################
    
    
        # PHP-Code-Blöcke zwischenspeichern #
          $c = md5(time());
          $pattern = "/\[php\](.*?)\[\/php\]/si";
          preg_match_all ($pattern, $text, $results);
          for($i=0;$i<count($results[1]);$i++) {
              $text = str_replace($results[1][$i], $c.$i.$c, $text);
          }
        # PHP-Code-Blöcke zwischenspeichern #
    
        # alles, was die Codeblöcke nicht betrifft #
          // zu lange Wörter kürzen
          $text = htmlentities($text);
          $lines = explode("\n", $text);
          $merk = $max_l;
          for($n=0;$n<count($lines);$n++) {
              $words = explode(" ",$lines[$n]);
              $count_w = count($words)-1;
              if($count_w >= 0) {
                  for($i=0;$i<=$count_w;$i++) {
                      $max_l = $merk;
                      $tword = trim($words[$i]);
                      $tword = preg_replace("/\[(.*?)\]/si", "", $tword);
                      $all = substr_count($tword, "http://") + substr_count($tword, "https://") + substr_count($tword, "www.") + substr_count($tword, "ftp://");
                      if($all > 0) {
                          $max_l = 200;
                      }
                      if(strlen($tword)>$max_l) {
                          $words[$i] = chunk_split($words[$i], $max_l, $lword_replace);
                          $length = strlen($words[$i])-5;
                          $words[$i] = substr($words[$i],0,$length);
                      }
                    }
                    $lines[$n] = implode(" ", $words);
              } else {
                  $lines[$n] = chunk_split($lines[$n], $max_l, $lword_replace);
              }
          }
          $text = implode("\n", $lines);
            //$text = htmlentities($text);
          $text = nl2br($text);
    
          // URLs umformen
          if($url) {
              $text = preg_replace('"(( |^)((ftp|http|https){1}://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)"i',
                                      ' <a href="\1" target="_blank">\\1</a>', $text);
              $text = preg_replace('"( |^)(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)"i',
                                      '\\1 <a href="http://\2" target="_blank">\\2</a>', $text);
              $text = preg_replace('"([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})"i',
                                      ' <a href="mailto:\1">\\1</a>', $text);
          }
    
          // BB-Code
          if($bb) {
              $text = preg_replace("/\[b\](.*?)\[\/b\]/si",
                                      "<b>\\1</b>", $text);
              $text = preg_replace("/\[i\](.*?)\[\/i\]/si",
                                      "<i>\\1</i>", $text);
              $text = preg_replace("/\[u\](.*?)\[\/u\]/si",
                                      "<u>\\1</u>", $text);
              $text = preg_replace("/\[list\](.*?)\[\/list\]/si",
                                      "<ul>\\1</ul>", $text);
              $text = preg_replace("/\[list=(.*?)\](.*?)\[\/list\]/si",
                                      "<ol type=\"\\1\">\\2</ol>", $text);
              $text = preg_replace("/\[\*\](.*?)\\n/si",
                                      "<li>\\1</li>", $text);
              $text = preg_replace("/\[align=(.*?)\](.*?)\[\/align\]/si",
                                      "<div align=\"\\1\">\\2</div>", $text);
              $text = preg_replace("/\[color=(.*?)\](.*?)\[\/color\]/si",
                                      "<font color=\"\\1\">\\2</font>", $text);
              $text = preg_replace("/\[size=(.*?)\](.*?)\[\/size\]/si",
                                      "<font size=\"\\1\">\\2</font>", $text);
              $text = preg_replace("/\[img\](.*?)\[\/img\]/si",
                                      "<img src=\"\\1\" border=\"0\">", $text);
              $text = preg_replace("/\[quote\](.*?)\[\/quote\]/si",
                                      $header_quote.'\\1'.$footer_quote, $text);
              $text = preg_replace("/\[code\](.*?)\[\/code\]/si",
                                      $header_code.'\\1'.$footer_code, $text);
              $text = preg_replace("/\[url=http:\/\/(.*?)\](.*?)\[\/url\]/si",
                                      "<a href=\"http://\\1\" target=\"_blank\">\\2</a>", $text);
              $text = preg_replace("/\[url=(.*?)\](.*?)\[\/url\]/si",
                 					 "<a href=\"http://\\1\" target=\"_blank\">\\2</a>", $text);
              $text = preg_replace("/\[email=(.*?)\](.*?)\[\/email\]/si",
                                      "<a href=\"mailto:\\1\">\\2</a>", $text);
          }
        # alles, was die Codeblöcke nicht betrifft #
    
        # PHP-Code-Blöcke umwandeln #
          for($i=0;$i<count($results[1]);$i++) {
              ob_start();
              highlight_string(trim($results[1][$i]));
              $ht = ob_get_contents();
              ob_end_clean();
              $all = $header_php.$ht.$footer_php;
              if(function_exists("str_ireplace")) {
                  $text = str_replace("[php]".$c.$i.$c."[/php]",$all,$text);
              } else {
                  $text = str_replace("[php]".$c.$i.$c."[/php]",$all,$text);
                  $text = str_replace("[PHP]".$c.$i.$c."[/PHP]",$all,$text);
              }
          }
        # PHP-Code-Blöcke umwandeln #
    
        // Text zurückgeben
        return $text;
    }
    mfg. Nico
    Geändert von schubertmedia (05.04.2006 um 14:12 Uhr)
    Php Webspace
    Suche Linkpartner für 10 Projekte, bei Interesse einfach eine PM.

  8. #8
    TP-Junior
    Registriert seit
    Apr 2006
    Beiträge
    12
    will grade mal deine Funktion testen, wie kann ich sie starten?

    ich starte meine bisher so:
    PHP-Code:
    bbcode_replace($story['story_text']); 
    Deine F. enthält ja direkt schon 2 Variablen wie ich das sehe!?

    Gruß azoo

  9. #9
    TP-Member Avatar von schubertmedia
    Registriert seit
    Mar 2005
    Beiträge
    31
    Zitat Zitat von azoo
    will grade mal deine Funktion testen, wie kann ich sie starten?

    ich starte meine bisher so:
    PHP-Code:
    bbcode_replace($story['story_text']); 
    Deine F. enthält ja direkt schon 2 Variablen wie ich das sehe!?

    Gruß azoo

    Hallo
    so kannst Du das machen.
    PHP-Code:
    echo bb_code($story['story_text'], 'Text_länge_bis_umbruch_in_zweichen_anzahl_angeben'); 
    mfg. Nico
    Php Webspace
    Suche Linkpartner für 10 Projekte, bei Interesse einfach eine PM.

  10. #10
    TP-Junior
    Registriert seit
    Apr 2006
    Beiträge
    12
    Ja, danke. Ich tat mich schwer mit deiner Zeichen_Anzahl_Angabe. Jetzt klappts.

    Text_länge_bis_umbruch_in_zweichen_anzahl_angeben
    Erklär mir mal warum du diese Abschneidefunktion drinn hast und was du für einen Zahlenwert gesetzt hast.

    Was mich auch noch wundert aber erfreut das ich mit deiner function nicht noch zusätzlich die function nl2br()
    nutzenmuß die mir hinter jeden Umbruch ein <br /> setzt.
    Kannst du mir erklären wieso es bei deiner ohne geht?



    Gruß azoo
    Geändert von azoo (05.04.2006 um 16:06 Uhr)

  11. #11
    TP-Member Avatar von schubertmedia
    Registriert seit
    Mar 2005
    Beiträge
    31
    Zitat Zitat von azoo
    Ja, danke. Ich tat mich schwer mit deiner Zeichen_Anzahl_Angabe. Jetzt klappts.


    Erklär mir mal warum du diese Abschneidefunktion drinn hast und was du für einen Zahlenwert gesetzt hast.

    Was mich auch noch wundert aber erfreut das ich mit deiner function nicht noch zusätzlich die function nl2br()
    nutzenmuß die mir hinter jeden Umbruch ein <br /> setzt.
    Kannst du mir erklären wieso es bei deiner ohne geht?



    Gruß azoo
    Hallo,

    naja ich setze die Funktion in ein Gästebuch Dienst ein, wo die User selber einstellen können wann der Umbruch gemacht werden soll. Um den richtigen Wert zu finden solltest Du selber ein wenig damit probieren bzw. Testen.

    Zu nl2br(), das brauchst Du nicht noch mal verwenden, da diese schon in der Funktion gemacht wird.

    mfg. Nico
    Php Webspace
    Suche Linkpartner für 10 Projekte, bei Interesse einfach eine PM.

  12. #12
    TP-Junior
    Registriert seit
    Apr 2006
    Beiträge
    12
    ich war heute mal so frei und habe deine funktion XHTML konform umgeschrieben.
    eine weitere klasse "Summary" für große Auszüge z.b. aus der Shell habe ich hinzugefügt.

    die <div> 's habe ich rausgeschmissen weil es in tabellenlosen markup nicht so gut ist, durch einen parser zusätzliche DIV'S hinein zu bekommen.

    ebenfalls target="blank" musste sich aus validitäts gründen verabschieden.

    ein problem gibts noch mit den listen, das kann aber auch an meinem box modell liegen.

    falls du interesse hast paste ichs nachher hier rein.

    gruß azoo

    ps:

    paste mir doch bitte mal den javascript insert von "email". laut php parst er [EMAIL=...]...
    bei mir flippt er total aus. ohne bbcode auszeichnung also nur azoo@webexil-linux.de gehts ohne probleme.
    vieleicht ists auch ein hochkommata problem. ich schaus heute nacht nicht mehr nach..
    machs gut bis später....
    Geändert von azoo (06.04.2006 um 00:31 Uhr)

  13. #13
    TP-Member Avatar von schubertmedia
    Registriert seit
    Mar 2005
    Beiträge
    31
    Hallo,

    jepp, Du hast recht. Bei den Email Code gibt es noch Fehler in der Funktion.

    Hier eine kleine änderung, dann sollte es gehen.

    HTML-Code:
    function bb_code($text, $max_l) {
    $url = TRUE; $bb = TRUE;
        /********************************************************************
        *
        *
        * $url -> TRUE, wenn URls automatisch umgewandelt werden sollen
        * $bb -> TRUE, wenn BB-Code umgewandelt werden soll
        *
        * Erklärung:
        * [b] [/b] werden zu <b> und </b>
        * [i] [/i] werden zu <i> und </i>
        * [u] [/u] werden zu <u> und </u>
        * [list][/list]werden zu <ul> und </ul>
        * [list=a][/list]werden zu <ol type="a"> und </ol>
        * [list=1][/list]werden zu <ol type="1"> und </ol>
        *
        *[*]... wird zu <li>...</li>
        * [align=center] [/align] wird zu <div align="center"> und </div>
        *
        * [color=red] [/color] wird zu <font color="red"> und </font>
        *
        * [size=1] [/size] wird zu <font size="1"> und </font>
        *
        * [img] [/img] werden zu <img src="...">
        * [code] [/code] --> siehe Config
        * [php] [/php] --> siehe Config
        * [quote] [/quote] --> siehe Config
        * [url=...]...[/url] wird zu <a href="..." target="_blank">...</a>
        * [email=...]...[/email] wird zu <a href="mailto:...">...</a>
        ********************************************************************/
    
    
        # Config #
          $lword_replace = "<br/>"; // Lange Wörter werden getrennt durch...
    
          // Header und Footer beschreiben, wie...
          // der farbige PHP-Code umschlossen wird
          $header_php = '<br/><br/><div>PHP-CODE:<br/><br/><code>';
          $footer_php = '</code></div><br/>';
    
          // Zitate umschlossen werden
          $header_quote = '<br/><br/><div><i>Zitat:</i><br/>';
          $footer_quote = '</div><br/>';
    
          // normaler code umschlossen wird
          $header_code = '<br/><br/><div>CODE:<br/><br/><pre>';
          $footer_code = '</pre></div><br/>';
        # Ab hier nichts mehr ändern #
    
        #####################################################################
    
    
        # PHP-Code-Blöcke zwischenspeichern #
          $c = md5(time());
          $pattern = "/\[php\](.*?)\[\/php\]/si";
          preg_match_all ($pattern, $text, $results);
          for($i=0;$i<count($results[1]);$i++) {
              $text = str_replace($results[1][$i], $c.$i.$c, $text);
          }
        # PHP-Code-Blöcke zwischenspeichern #
    
        # alles, was die Codeblöcke nicht betrifft #
          // zu lange Wörter kürzen
          $text = htmlentities($text);
          $lines = explode("\n", $text);
          $merk = $max_l;
          for($n=0;$n<count($lines);$n++) {
              $words = explode(" ",$lines[$n]);
              $count_w = count($words)-1;
              if($count_w >= 0) {
                  for($i=0;$i<=$count_w;$i++) {
                      $max_l = $merk;
                      $tword = trim($words[$i]);
                      $tword = preg_replace("/\[(.*?)\]/si", "", $tword);
                      $all = substr_count($tword, "http://") + substr_count($tword, "https://") + substr_count($tword, "www.") + substr_count($tword, "ftp://");
                      if($all > 0) {
                          $max_l = 200;
                      }
                      if(strlen($tword)>$max_l) {
                          $words[$i] = chunk_split($words[$i], $max_l, $lword_replace);
                          $length = strlen($words[$i])-5;
                          $words[$i] = substr($words[$i],0,$length);
                      }
                    }
                    $lines[$n] = implode(" ", $words);
              } else {
                  $lines[$n] = chunk_split($lines[$n], $max_l, $lword_replace);
              }
          }
          $text = implode("\n", $lines);
            //$text = htmlentities($text);
          $text = nl2br($text);
    
          // URLs umformen
          if($url) {
              $text = preg_replace('"(( |^)((ftp|http|https){1}://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)"i',
                                      ' <a href="\1" target="_blank">\\1</a>', $text);
              $text = preg_replace('"( |^)(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)"i',
                                      '\\1 <a href="http://\2" target="_blank">\\2</a>', $text);
                   }
    
          // BB-Code
          if($bb) {
              $text = preg_replace("/\[b\](.*?)\[\/b\]/si",
                                      "<b>\\1</b>", $text);
              $text = preg_replace("/\[i\](.*?)\[\/i\]/si",
                                      "<i>\\1</i>", $text);
              $text = preg_replace("/\[u\](.*?)\[\/u\]/si",
                                      "<u>\\1</u>", $text);
              $text = preg_replace("/\[list\](.*?)\[\/list\]/si",
                                      "<ul>\\1</ul>", $text);
              $text = preg_replace("/\[list=(.*?)\](.*?)\[\/list\]/si",
                                      "<ol type=\"\\1\">\\2</ol>", $text);
              $text = preg_replace("/\[\*\](.*?)\\n/si",
                                      "<li>\\1</li>", $text);
              $text = preg_replace("/\[align=(.*?)\](.*?)\[\/align\]/si",
                                      "<div align=\"\\1\">\\2</div>", $text);
              $text = preg_replace("/\[color=(.*?)\](.*?)\[\/color\]/si",
                                      "<font color=\"\\1\">\\2</font>", $text);
              $text = preg_replace("/\[size=(.*?)\](.*?)\[\/size\]/si",
                                      "<font size=\"\\1\">\\2</font>", $text);
              $text = preg_replace("/\[img\](.*?)\[\/img\]/si",
                                      "<img src=\"\\1\" border=\"0\">", $text);
              $text = preg_replace("/\[quote\](.*?)\[\/quote\]/si",
                                      $header_quote.'\\1'.$footer_quote, $text);
              $text = preg_replace("/\[code\](.*?)\[\/code\]/si",
                                      $header_code.'\\1'.$footer_code, $text);
              $text = preg_replace("/\[url=http:\/\/(.*?)\](.*?)\[\/url\]/si",
                                      "<a href=\"http://\\1\" target=\"_blank\">\\2</a>", $text);
              $text = preg_replace("/\[url=(.*?)\](.*?)\[\/url\]/si",
                 					 "<a href=\"http://\\1\" target=\"_blank\">\\2</a>", $text);
              $text = preg_replace("/\[email=(.*?)\](.*?)\[\/email\]/si",
                                      "<a href=\"mailto:\\1\">\\2</a>", $text);
          }
        # alles, was die Codeblöcke nicht betrifft #
    
        # PHP-Code-Blöcke umwandeln #
          for($i=0;$i<count($results[1]);$i++) {
              ob_start();
              highlight_string(trim($results[1][$i]));
              $ht = ob_get_contents();
              ob_end_clean();
              $all = $header_php.$ht.$footer_php;
              if(function_exists("str_ireplace")) {
                  $text = str_replace("[php]".$c.$i.$c."[/php]",$all,$text);
              } else {
                  $text = str_replace("[php]".$c.$i.$c."[/php]",$all,$text);
                  $text = str_replace("[PHP]".$c.$i.$c."[/PHP]",$all,$text);
              }
          }
        # PHP-Code-Blöcke umwandeln #
    
        // Text zurückgeben
        return $text;
    }
    mfg. Nico
    Geändert von schubertmedia (06.04.2006 um 01:29 Uhr)
    Php Webspace
    Suche Linkpartner für 10 Projekte, bei Interesse einfach eine PM.

  14. #14
    TP-Junior
    Registriert seit
    Apr 2006
    Beiträge
    12
    ich kenne mich mit syntax-highlighting nicht so aus. solle deine funktion diese nicht mitbringen?
    bei mir beleibt der text einfarbig.

    EDIT:
    nehme ich zurück aber hast du bezüglich php auch noch eine änderung auf lager? so ist der ausgegebene code nicht brauchbar.
    die hochkommata werden gebackslahed!


    gruß azoo
    Geändert von azoo (06.04.2006 um 17:08 Uhr)

  15. #15
    TP-Member Avatar von schubertmedia
    Registriert seit
    Mar 2005
    Beiträge
    31
    Hallo azoo,

    hast Du den Code von Dir angepast ? Was hast Du durch die Funktion genau laufen lassen und läuft nicht.

    mfg. Nico
    Php Webspace
    Suche Linkpartner für 10 Projekte, bei Interesse einfach eine PM.

Seite 1 von 2 12 LetzteLetzte

LinkBacks (?)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)


LinkBacks (?)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51