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