Visualizzazione dei risultati da 1 a 1 su 1

Discussione: Libreria BB Code

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,317

    Libreria BB Code

    Ciao a tutti, sto sviluppando una Bulletin Board (no oop), e ultimamente ho avuto un pò di difficoltà nello sviluppare il bbcode, di conseguenza mi sono messo le mani in pasta e ho studiato un pò...

    Vi presento la soluzione da me programmata:
    bbcode.php
    Codice PHP:
    <?php

        
    /**
         *
         */
        
    function regexB($text) {
            return 
    preg_replace("/\[b\](.*?)\[\/b\]/""<b>\\1</b>"$text);
        }
        
        
    /**
         *
         */
        
    function regexU($text) {
            return 
    preg_replace("/\[u\](.*?)\[\/u\]/""<u>\\1</u>"$text);
        }
        
        
    /**
         *
         */
        
    function regexI($text) {
            return 
    preg_replace("/\[i\](.*?)\[\/i\]/""<i>\\1</i>"$text);
        }

        
    /**
         *
         */
        
    function regexImg($text) {
            return 
    preg_replace("/\[img\](http|https|ftp){1}(:\/\/){1}(.*?)\[\/img\]/""<img src=\"\\1\\2\\3\" />"$text);
        }
        
        
    /**
         *
         */
        
    function regexColor($text$colors = array("red""blue""purple""orange""yellow""gray""green")) {
            return 
    preg_replace("/\[color=(" implode("|"$colors) . ")\](.+?)\[\/color\]/is""<span style='color:\\1;line-height:100%'>\\2</span>"$text);
        }
        
        
    /**
         *
         */
        
    function regexFont($text$fonts = array("arial""times""courier""impact""geneva""optima")) {
            return 
    preg_replace("/\[font=(" implode("|"$fonts) . ")\](.*?)\[\/font\]/is""<span style='font-family:\\1'>\\2</span>"$text);
        }
        
        
    /**
         *
         */
        
    define("FORMAT_EM""em");
        
    define("FORMAT_PX""px");
        
    define("FORMAT_PM""pm");
        function 
    regexSize($text$sizes = array(1234567), $format FORMAT_PM) {
            return 
    preg_replace("/\[size=(" implode("|"$sizes) . ")\](.+?)\[\/size\]/is""<span style='font-size:\\1{$format};line-height:100%'>\\2</span>"$text);
        }
        
        
    /**
         *
         */
        
    function regexEmail($text) {
            
    $text preg_replace"/\[email\](.*?)\[\/email\]/i"                                            "<a href='mailto:\\1'>\\1</a>"$text);
            
    $text preg_replace"/\[email\s*=\s*([\.\w\-]+\@[\.\w\-]+\.[\w\-]+)\s*\](.*?)\[\/email\]/is"    "<a href='mailto:\\1'>\\2</a>"$text);
            return 
    $text;
        }
        
        
    /**
         *
         */
        
    function regexLink($text) {
            
    $html preg_replace("/\[url\](http|https|ftp){1}(:\/\/){1}(.*?)\[\/url\]/is"                    "<a href=\"\\1\\2\\3\">\\1\\2\\3</a>"    $text);
            
    $html preg_replace"/\[url\s*=\s*(http|https|ftp){1}(:\/\/){1}(.*?)\s*\](.*?)\[\/url\]/is"    "<a href=\"\\1\\2\\3\">\\4</a>"        $text);
            return 
    $text;
        }
        
        
    /**
         *
         */
        
    function regexQuote($text$openTag "<div name='quote'>"$closedTag "</div>"$writtenBy "Written by <strong>%s</strong><br />") {
            
    $text preg_replace("/\[quote](.*?)\[\/quote\]/is"                        "{$openTag}\\1{$closedTag}"                                                        $text);
            
    $text preg_replace("/\[quote\s*=\s*(.*?){1}\s*\](.*?)\[\/quote\]/is"    "{$openTag}sprintf($writtenByhtmlspecialchars("\\1")) . "\\2{$closedTag}"    $text);
            return 
    $text;
        }
        
        
    /**
         *
         */
        
    define("OPEN_UL"    "<ul>");
        
    define("CLOSED_UL"    "</ul>");
        function 
    regexUL() {
            return array(
                
    "(\
    [list\])"
    ,
                
    "(\[\*\].*?\[\/\*\])",
                
    "(\[\/list\])"
            
    );
        }
        
        
    /**
         *
         */
        
    define("OPEN_LI"    "<li>");
        
    define("CLOSED_LI"    "</li>");
        function 
    regexLI() {
            return array(
                
    //
                
    "(\[\*\].*?\[\/\*\])",
                
                
    //
                
    "\[\*\](.*?)\[\/\*\]"
            
    );
        }
        
        
    /**
         *
         */
        
    define("OPEN_CODE"    "<pre>");
        
    define("CLOSED_CODE""</pre>");
        function 
    regexCode() {
            return array(
                
    "(\[code\])",
                
    "(\[\/code\])",
            );
        }
        
        
    /**
         *
         */
        
    function parseCode($text) {
            
    $regexUL    regexUL();
            
    $regexLI    regexLI();
            
    $regexCode    regexCode();
            
    $regexp         "/" implode("|"$regexUL) . "|" implode("|"$regexCode) . "|{$regexLI[0]}/";
            
    $code          preg_split($regexp$text, -1PREG_SPLIT_DELIM_CAPTURE PREG_SPLIT_NO_EMPTY);
            
    $html         "";
            
    $bb_ul          $bb_code false;
            
            while (
    $parsed htmlspecialchars(array_shift($code))) {
                if (
    preg_match("/{$regexCode[0]}/"$parsed) && !$bb_code) {
                    
    $html .= OPEN_CODE;
                    
    $bb_code true;
                }
                elseif (
    preg_match("/{$regexCode[1]}/"$parsed) && $bb_code) {
                    
    $html .= CLOSED_CODE;
                    
    $bb_code false;
                }
                elseif (
    preg_match("/{$regexUL[0]}/"$parsed) && !$bb_code) {
                    
    $html .= OPEN_UL;
                    
    $bb_ul true;
                }
                elseif (
    preg_match("/{$regexLI[1]}/"$parsed$return) && !$bb_code && $bb_ul) {
                    
    $html .= "<li>{$return[1]}</li>";
                }
                elseif (
    preg_match("/{$regexUL[2]}/"$parsed) && !$bb_code && $bb_ul) {
                    
    $html .= CLOSED_UL;
                    
    $bb_ul false;
                }
                else {
                    if (!
    $bb_code) {
                        
    $parsed regexB($parsed);
                        
    $parsed regexU($parsed);
                        
    $parsed regexI($parsed);
                        
    $parsed regexImg($parsed);
                        
    $parsed regexColor($parsed);
                        
    $parsed regexFont($parsed);
                        
    $parsed regexSize($parsed);
                        
    $parsed regexEmail($parsed);
                        
    $parsed regexLink($parsed);
                        
    $parsed regexQuote($parsed);
                    }
                    
    $html .= $parsed;
                }
            }
            
            return 
    $html;
        }
    ?>


    I BBcode presenti sono:

    - [ size=2 ]dimensione 2{pt/px/em/possibile aggiungere altri formati}[ / size ]
    - [ URL ]http://google.it[ / URL ]
    - [ URL = http://google.it ]clicca qui per visitare google[ / URL ]
    - [ code ]codice formattato[ / code ]
    - [ quote ]post quotato[ / quote ]
    - [ quote=admin ]post quotato dell'admin[ / quote ]
    - [ IMG ]http://example.com/image.gif[ / IMG ]
    - [ EMAIL ]email@examle.com[ / EMAIL ]
    - [ EMAIL = email@examle.com ]clicca qui per inviare email[ / EMAIL ]
    - [ COLOR=red]colore rosso[ / COLOR ]
    - [ FONT=arial]testo in arial
    [ / font]

    In futuro sviluppero una funzione che utilizzerà le regex da db e permetterò l'aggiunta, la cancellazione e l'abilitazione/disabilitazione del bbcode selezionato.

    Attualmente è possibile modificare i seguenti metodi (o funzioni):
    1)
    function regexColor($text, $colors = array("red", "blue", "purple", "orange", "yellow", "gray", "green"));

    modificando l'array con i colori permessi all'interno del bbcode [color]

    2)
    function regexFont($text, $fonts = array("arial", "times", "courier", "impact", "geneva", "optima"));

    modificando l'array con i fonts permessi all'interno del bbcode [font]

    3)
    define("FORMAT_EM", "em");
    define("FORMAT_PX", "px");
    define("FORMAT_PM", "pm");
    function regexSize($text, $sizes = array(1, 2, 3, 4, 5, 6, 7), $format = FORMAT_PM);


    Modificando sia l'array della grandezza del font, sia il il formato (em/px/pm)

    4)
    define("OPEN_UL" , "<ul>");
    define("CLOSED_UL" , "</ul>");


    selezionando il tag per le liste preferito (es. <ul type="square">)

    5)
    define("OPEN_LI" , "<li>");
    define("CLOSED_LI" , "</li>");


    ...

    6)
    define("OPEN_CODE" , "<pre>");
    define("CLOSED_CODE", "</pre>");


    Inserendo l'html del tag di apertura dello stile del "code" che utilizzate sul vostro sito.

    7)
    function regexQuote($text, $openTag = "<div name='quote'>", $closedTag = "</div>", $writtenBy = "Written by <strong>%s</strong><br />")

    Inserendo il nome del tag di apertura per i "quote" e la scritta che venga stampata nel caso venga quotato uno specifico utente.

    Piccola precisazione, da fanatico di bug hunting (ho passato parecchi anni della mia vita a sviluppare exploit) i bbcode sviluppati NON sono hackerabili dalle metodologie attualmente conosciute nel mondo dell'informatica.

    Piccoli esempi di bbcode non funzionanti sui quali è possibile sfruttare leaks:

    Codice PHP:
    1) [ URL="avascript:alert(document.cookie)"]clicca qui[/URL]
    2) [ URL="http://"><script>alert(document.cookie)</script>"]clicca qui[/URL]
    3) [ img]javascript:alert(document.cookie)[/img] // questo codice non è funzionante sui browser di nuova generazione ma riadattandolo, lo diventa. 
    è possibile ottimizzare le prestazioni del codice levando l'htmlspecialchars all'interno del ciclo while ed inserendolo altrove. Ovviamente se lo piazzate male e poi non vi funziona qualcosa non mi riterrò responsabile, la differenza di prestazione è di qualche millesimo di secondo, però, alcuni programmatori seri ci tengono ad avere un codice serio e professionale per una questione morale.

    Sono ovviamente fixati tutti i bug come l'inserimento di [code] annidati e bbcode mal inseriti.

    Un saluto, Tomas.
    Ultima modifica di zacca94; 02-04-2014 a 09:49

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.