un'altra soluzione sarebbe da esaminarla prima di mandarla in pasto al bbcode parser. a tal proposito mi son creato una funzioncina :
codice:
    function checkLinks($string) {
        $arrelab="";
        $arr=explode(' \r\n', $string);
        for($i=0; $i<sizeof($arr); $i++) {
            if ((strpos($arr[$i], 'www.')!==false) or (strpos($arr[$i], 'http://')!==false) or (strpos($arr[$i], 'ftp://')!==false)) {
                if (strpos($arr[$i], '[url=')===false) {
                    $arr[$i]=''.$arr[$i].'';
                }
            }
            
            $arrelab=$arrelab." ".$arr[$i];
        }
        return $arrelab;
    }

    // row[0] è la stringa da stampare, presa dal DB
    <? $row[0]=checkLinks(htmlspecialchars($row[0])); ?>
    <?=forumBBCode($row[0])?>
sembra funzionare, tranne per il fatto che fà l'explode solo per un parametro ' ' (lo spazio), e a me servirebbe oltre che allo spazio anche per i ritorni a capo (non sò se esiste un modo con l'explore di impostare più delimitatori);

questo approccio non sò se sia il migliore, in quanto se ho una stringa memorizzata (supponiamo) in un mediumtext di mysql, fare l'explode su tale stringa è un operarazione esosa... (anche se il preg_replace viene cmq applicato su una stringa di tale dimensione...)

aspetto qualche vostra illuminazione