preg_match
тег первым, получите имя пользователя, выполните запрос (будьте осторожны и сделайте этот шаг безопасным!) И замените всю совпавшую строку новой ссылкой:
preg_match_all ( '#\[user\](.*?)\[/user\]#i', $text, $matches, PREG_SET_ORDER );
for ( $i = 0, $j = count( $matches ); $i < $j; $i++ )
{
$userName = $matches[$i][1];
$userId = 0;
// query example with mysqli
$stmt = $sql->prepare( 'SELECT uid FROM users WHERE username = ? LIMIT 1' );
$stmt->bind_param( 's', $userName );
$stmt->execute();
$stmt->bind_result( $userId );
if ( $stmt->fetch() )
{
$text = str_replace( $matches[$i][0], "<a href=\"/user/$userId/$userName\" title=\"$userName\">$userName</a>", $text );
}
}