avevo trovato una bella funzione epr i bbcode scritta da un utente del forum

Codice PHP:
<?php
 
 
function bbcode($text) {

       
$bb_code[0] = '/(\\n)/i';
       
$bb_replace[0] = '
'
;

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

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

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

       
$bb_code[4] = '/(\[url\=(.+?)\](.+?)\[\/url\])/i';
       
$bb_replace[4] = '[url="${2}"]${3}[/url]';

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

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

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

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

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

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

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

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

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

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

       
$return preg_replace($bb_code$bb_replace$text);
       return 
$return;
   }
   
   
?>
funziona perfettamente quando nel testo c'è epr esempio solo un [ b] [ /b] oppure un solo [url =link] [/ url] etc.. ma quando c'è ne sono più di uno prende il primo tag di apertura e l'ultimo nel testo e quindi si sballa tutto..

qualcuno sa il perchè? e saprebbe correggemelo?