Таким образом, проблема в том, что вы делаете несколько проходов по документу, заменяя другое имя пользователя на каждом проходе, и вы боитесь, что вы непреднамеренно замените имя внутри тега, созданного в предыдущем проходе, право
Я бы попытался выполнить все замены за один проход, используя preg_replace_callback
, как предложено @ircmaxwell, и один регулярное выражение, которое может соответствовать любому допустимому имени пользователя. В функции обратного вызова вы просматриваете совпавшую строку, чтобы увидеть, действительно ли это имя пользователя. Если это так, верните сгенерированную ссылку; если нет, верните соответствующую строку для повторной вставки.