Semplicemente, al posto di dirgli "cosa" sostituire metti una funzione che viene richiamata a ogni corrispondenza ed il valore ritornato da questa funzione verrà utilizzato per la sostituzione
Se guardi nel manuale, sia tra gli esempi sia tra i commenti c'è parecchia roba
http://www.php.net/manual/en/functio...e-callback.php
Quello che vuoi fare tu va integrato con il database e quindi è necessaria far intervenire una funzione che, ricevuto l'id dell'utente, effettui la ricerca sul database per visualizzarne il nome utente.
Se hai difficoltà, invece, a scrivere l'espressione regolare, ti consiglio di dare un'occhiata al manuale
http://www.php.net/manual/en/referen....modifiers.php
http://www.php.net/manual/en/referen...ern.syntax.php
Un'alternativa è l'utilizzo del modificatore PREG_REPLACE_EVAL
Trovi qualcosa che fa riferimento a quel modificatore, oltre che nella pagina relativa ai modificatori, anche qui
http://www.php.net/manual/en/function.preg-replace.php
sotto la voce parameters -> replacement
comunque, possiamo ipotizzare qualcosa del genere
Codice PHP:
function get_nickname_from_id($id)
{
// qui devi scrivere il codice che, leggendo l'id utente, acquisisce le informazioni dal database
// E' assolutamente fondamentale controllare che l'id sia un numero maggiore di zero altrimenti rischi delle sql injection!!!!!
return 'NOME UTENTE';
}
function bbcode($testo)
{
$bb_prima = array
(
'/\\[ b\\](.*?)\\[\\/b\\]/is',
'/\\[ i\\](.*?)\\[\\/i\\]/is',
'/\\[ u\\](.*?)\\[\\/u\\]/is',
'/\\[ img\\](.*?)\\[\\/img\\]/is',
'/\\[ url\\](.*?)\\[\\/url\\]/is',
'/\\[ url=(.*?)\\](.*?)\\[\\/url\\]/is',
'/\\[ mailto\\](.*?)\\[\\/mailto\\]/is',
'/\\[ idutente=(.*?)\\]/is',
'/\\[ idutente\\](.*?)\\[\\/idutente\\]/ise',
);
$bb_dopo = array
(
'[b]$1[/b]',
'[i]$1[/i]',
'<u>$1</u>',
'[img]$1[/img]',
'[url="$1"]$1[/url]',
'[url="$1"]$2[/url]',
'[email="$1"]$1[/email]' ,
'[b]get_nickname_from_id($1)[/b]',
'[b]get_nickname_from_id($1)[/b]'
);
// La sostituzione dei \n, \r e \n\r la si può far fare direttamente a nl2br per sgravare il lavoro al motore delle preg
$testo = nl2br(preg_replace($bb_prima, $bb_dopo, $testo));
return $testo;
}
?>
PS: le preg con '/(.*?)/is', immagino siano state "tagliate" via dal forum mi sono preso la libertà di riscriverle, controllale comunque ... inoltre gli spazi tra la prima quadra ed il contenuto li ho messi di proposito onde evitare di averli tagliati via dal forum
PS2: è possibile, anzi direi probabile, che non ti funzioneranno a prima botta quindi fai qualche prova e eventualmente riporta gli errori 
PS3: ti ho scritto il tag idutente in due forme, usa poi quella che preferisci