Prima di tutto ti consiglio vivamente di non eseguire query all'interno del foreach(), piuttosto utilizzare l'operatore IN() di MySQL nel campo username.
Prova una cosa simile:
Codice PHP:
preg_match_all('/(?<=@)(.+?)\b/s', $messaggio, $utenti_taggati);
$link_tag = $exist = array();
/*
Estrai solo i dati che ti servono (uid, username in questo caso).
Basta che li aggiungi, ma evita di estrarre tutto perché appesantisci
il lavoro per nulla.
*/
$res = mysql_query('SELECT DISTINCT uid, username
FROM users
WHERE username = IN (\'' . implode('\', \'', array_map('mysql_real_escape_string', $utenti_taggati)) . '\')';
while($row = mysql_fetch_assoc($res))
{
/*
Aggiungi all'array l'utente che esiste. È estratto dal DB,
quindi hai la certezza che sia presente.
*/
$exist[] = $row['username'];
$link_tag[] = '[url=' . $p . '/member.php?action=profile&uid=' . $row['uid'] . ']@' . $row['username'] .'[/url]';
}
/*
Qui hai tutti gli utenti taggati, ma NON esistenti,
mentre in $exist hai tutti quelli esistenti.
*/
$utenti_taggati = array_unique(array_merge($utenti_taggati, $exist));
Non testato perché non ho il tuo codice, ma credo che smanettandoci un po', riesca ad ottenere il risultato che vuoi.