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