Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di tziggie
    Registrato dal
    Mar 2007
    Messaggi
    105

    costruzione bbcode funzionante

    Salve a tutti.
    Qualche giorno fa avevo abbozzato un inizio di funzione per ottenere un bbcode nel testo di un forum. La potete trovare qui . Dopo un po' di tentativi e di aggiustamenti credo di essere riuscito nel mio intento.

    La funzione è basata sulla sostituzione di stringhe all'interno del testo. Sono tre funzioni, in realtà. Posto lo script chiosato e commentato in attesa di suggerimenti per migliorarlo qualora fosse necessario.
    Codice PHP:
    <?php

        
    function crea_stringhe($testo$x$y){

        
    $pos=strpos($testo"[$x]");//posizione all'interno del testo  del primo tag

        
    $stringa_tag=strstr($testo"[$x]");//creo una nuova stringa che inizia con il primo tag di apertura
    //trovato nel $testo
        

        
    $posx=strpos($stringa_tag"[$x]");//posizione del tag di apertura nella stringa

        
    $posy=strpos($stringa_tag"[/$y]");//posizione del tag di chiusura nella stringa

        

        
    $lenx=strlen("[$x]");//lunghezza in caratteri del tag di apertura

        
    $leny=strlen("[/$y]");//lunghezza in caratteri del tag di chiusura

            

            
    if(($x==$y)and(strstr($stringa_tag"[/$y]"))){//se all'interno della stringa è presente un
    //tag di chiusura e le stringhe contenute all'interno dei tag sono uguali

                
    if($x=="b" or $x=="i" or $x=="u"){//specificazione forse non necessaria

                    
    $n_str=substr_replace($stringa_tag"</$y>"$posy$leny);//sostituisco il tag 
    //di chiusura alla fine della stringa che inizia col tag di apertura trovato, a partire dalla posizione del 
    //tag per la lunghezza del tag stesso

                    
    $n_testo=substr_replace($n_str"<$x>"$posx$lenx);//sostituisco il tag di
    //apertura all'inizio della stringa appena trasformata, a partire dalla posizione del tag per la 
    //lunghezza del tag stesso
    /*in realtà potrei non aver bisogno di individuare la lunghezza del tag, visto che so che è
    composto da una sola lettera*/

                    
    $l_n_testo=strlen($n_testo);//calcolo la lunghezza del testo ottenuto
    /*questa variabile è superflua dato che la stringa che ho modificato verrà sostituita all'interno del testo
    a partire dal punto in cui comincia la stringa stessa, cioé lì dove ho incontrato il primo tag apertura*/
                

                    
    $testo_finale=substr_replace($testo$n_testo$pos);//parametro lunghezza
    //non è quindi indicato

                    
    }else if($x=="quote"){

                        
    $n_str=substr_replace($stringa_tag"</div>"$posy$leny);//discorso a
    //parte per il tag \[\q\u\o\t\e\] per il quale non può bastare una semplice sostituzione come per [B]b[/B] 

                        
    $n_testo=substr_replace($n_str"<div class=\"cit\">"$posx$lenx);

                        
    $l_n_testo=strlen($n_testo);

                        
    $testo_finale=substr_replace($testo$n_testo$pos);

                        }

                }else{

                    
    $testo_finale=$testo;

                    }

            return 
    $testo_finale;

        }

    Con la funzione crea_stringhe ho sostituito i tag bbcode con tag html solo nella prima stringa che rispettava tutte le condizioni, cioé cominciare con un tag apertura, avere un tag di chiusura con la stessa lettera (o stringa nel caso di quote) di seguito. Bisogna applicare la funzione a tutto il testo.

    Codice PHP:
    function reitera($testo$x,$y){

            
    $varx=(substr_count($testo"[$x]"));//conto le occorrenze di tag apertura

            
    $vary=(substr_count($testo"[/$y]"));

            if(
    $varx>AND $x==$y){//se c'è almeno un tag di apertura faccio partire il controllo

                
    for($cont=0;$cont<$varx;$cont++){//il controllo si ripete sul testo per un numero di
    // volte pari al numero di occorrenze di tag apertura

                    
    $stringa=strstr($testo"[$x]");//compio un'operazione analoga a quella della
    //prima funzione - forse c'è un modo per accorpare le due funzioni

                        
    if(strstr($stringa"[/$y]")){//se c'è il tag chiusura

                            
    $testo=crea_stringhe($testo,$x,$y);//applico la prima funzione
    /* qui ho un  dubbio consistente; per far funzionare il ciclo devo creare una variabile con lo 
    stesso nome della variabile iniziale; dato che applico la funzione crea_stringhe a $testo, 
    il risultato finale del ciclo deve essere sempre $testo*/

                        
    }else{//se non è seguito dal tag di chiusura

                            
    $testo=$testo;

                            }
    //else

                        
    }//for

                    
    }//primo if

            
    return $testo;

        } 
    Anche la funzione reitera ha un difetto sostanziale; bisogna specificare quali tag cercare all'interno del testo; allora ho fatto questa piccola funzione sulla base della precedente che non necessita troppo spiegazioni... nelle due funzioni precedenti bisognava specificare $x e $y, con l'ultima funzione estendo la ricerca a tutti i tag di cui ho bisogno - quelli ordinati nell'array
    Codice PHP:
    function bbcode($testo){ 

            
    $var=array("i""u""quote","b");

                for(
    $cont=0$cont<4$cont++){

                    
    $testo=reitera($testo$var[$cont], $var[$cont]);

                    }

            return 
    $testo;

            }

    ?> 
    Funziona.
    Per il forum che sto per costruire, che è un piccolo forum, è davvero comodo. Basta applicare la funzione al testo del messaggio che richiamo dal database.

    E' utile perché cambia i tag bbcode con tag html solo nelle stringhe complete. Ho avuto la necessità di andare più in là di una semplice sostituzione di testo e di creare dei controlli per ovvi motivi. Se qualcuno, per sbaglio o per cattiveria, aprisse il tag QUOTE e non lo chiudesse, dato che corrisponde al tag html DIV farebbe non pochi danni alla pagina.

    Scusate se mi sono dilungato troppo. Attendo suggerimenti.

    Ciao a tutti

  2. #2

  3. #3
    Utente di HTML.it L'avatar di tziggie
    Registrato dal
    Mar 2007
    Messaggi
    105
    In effetti è un po' pesantuccio. Più che altro è ridondante.

    Anche secondo me si può alleggerire. Consigli?

  4. #4
    ciauz...ti metto qui sotto una prova che avevo fatto un po' di tempo fa...
    nn mi ricordo se funzionava con tutti i tag...può essere ottimizzata...e sistemata...

    Codice PHP:
       function convert_bb_html($text) {


           
    $bb_code[0] = '/(\[b\])(.*)(\[\/b\])/i';
           
    $bb_replace[0] = '[b]${2}[/b]';

           
    $bb_code[1] = '/(\[code\])(.*)(\[\/code\])/i';
           
    $bb_replace[1] = '<pre>${2}</pre>';

           
    $bb_code[2] = '/(\[img\=(.+?)\])(.*)(\[\/img\])/i';
           
    $bb_replace[2] = '[img]${2}[/img]';

           
    //$bb_code[3] = '/(\[size\)(.*)(\[\/size\])/i';
           
    $bb_code[3] = '/(\[size\=([1-9])\])([^\a]+?)(\[\/size\])/i';
           
    $bb_replace[3] = '<span style="font-size: ${2}pt;">${3}</span>';

           
    $bb_code[4] = '/(\[color\=([\#]?[0-9a-f]{3}|[\#]?[0-9a-f]{6}|[a-z]{3,})\]([^\a]+?)\[\/color\])/i';
           
    $bb_replace[4] = '<span style="color: ${2};">${3}</span>';

           
    $bb_code[5] = '/(\[quote\])(.*)(\[\/quote\])/i';
           
    $bb_replace[5] = '<pre>${2}</pre>';

           
    $bb_code[5] = '/(\[i\])(.*)(\[\/i\])/i';
           
    $bb_replace[5] = '[i]${2}[/i]';

           
    $bb_code[6] = '/(\[u\])(.*)(\[\/u\])/i';
           
    $bb_replace[6] = '<u>${2}</u>';

           
    $bb_code[7] = '/(\[align\=(left|right|center)\]([^\a]+?)\[\/align\])/i';
           
    $bb_replace[7] = '<div align="${2}">${3}</div>';

           
    $bb_code[8] = '/(\[url\=(.+?)\](.+?)\[\/url\])/i';
           
    $bb_replace[8] = '[url="${2}"]${3}[/url]';
           
           
    $bb_code[9] = '/(\[hr])/i';
           
    $bb_replace[9] = '<hr>';

           
    $bb_code[10] = '/(\[list\])(.*)(\[\/list\])/i';//lista non ordinata
           
    $bb_replace[10] = '<ul>${2}[/list]';

           
    $bb_code[11] = '/(\[list\=1\]([^\a]+?)\[\/list\])/i'//lista numerata
           
    $bb_replace[11] = '[list=1]${2}[/list]';

           
    $bb_code[12] = '/(\[list\=(a|A|i|I)\]([^\a]+?)\[\/list\])/i'//lista ordinata con lettere o numeri romani
           
    $bb_replace[12] = '[list=1]${3}[/list]';

           
    $bb_code[13] = '/(\[\*\](.+?)\[\/\*\])/i'//elemento della lista
           
    $bb_replace[13] = '[*]${2}';

           
    $return preg_replace($bb_code$bb_replace$text);
           return 
    $return;
       } 
    una nota: alcuni tag sono diversi dalla sintassi standard...io l'avevo fatto così perchè era il modo in cui mi serviva...quindi ti conviene controllare...
    altra cosa: questa funzione funge solo se il testo è tutto su una linea... cioè se nn hai degli \n

    per farlo funzionare su un testo multi-linea se nn sbaglio devi modificare alla fine di ogni espressione regolare /i e sostituirlo con /ims


    edit: attenzione...il forum mi interpreta alcuni tag, per vederlo corretto devi quotare il mio messaggio

    ciauz

  5. #5
    Utente di HTML.it L'avatar di tziggie
    Registrato dal
    Mar 2007
    Messaggi
    105
    In effetti è decisamente più semplice così.

    Non è che mi spiegheresti che criteri hai utilizzato le stringhe-parametri da passare a preg_replace? Anch'io avevo cominciato con preg, ma non riuscivo ad andare avanti perché sbagliavo sempre qualcosa scrivendo i parametri.

    La mia funzione è pesante perché si ripercorre tutto il testo per un numero di volte pari ai tag presenti. Sono soddisfatto comunque perché funziona (ed è la prima volta che provo a scriverne una ). Però la strada seguita non è la più semplice.

    Grazie per la risposta.

  6. #6
    Utente di HTML.it L'avatar di tziggie
    Registrato dal
    Mar 2007
    Messaggi
    105
    Funziona perfettamente, solo (QUOTE) non andava perché aveva lo stesso indice di (I).

    Hai voglia (o qualcuno ha voglia) di spiegarmi la differenza tra (.*) e ([^\a]+?) ?

    Grazie, ciao.

  7. #7
    si...hai ragione... nn mi ero accorto di aver messo 5 in entrambi...

    cmq eccoti un ottimo link che chiarisce ogni tua domanda http://www.php.net/manual/it/referen...ern.syntax.php

    ciauzz

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.