Насколько я понимаю, вы делаете следующее:
Вы храните строку, содержащую несколько @
var str = "hello @something and @someone ok";
и ссылку
var link = "stackoverflow.com";
Тогдавы применяете str.replace
к этой строке
str = str.replace(/@([^ ]+\s[^ ]+)/g, '<a href="'+link+'"> $& </a>');
В результате получается
"hello <a href="stackoverflow.com"> @something </a> and <a href="stackoverflow.com"> @someone </a> ok"
Затем вы меняете ссылку
link = "stackoverflow.com/questions/tagged/javascript";
и снова применяете str.replace
ваша строка
str = str.replace(/@([^ ]+\s[^ ]+)/g, '<a href="'+link+'"> $& </a>');
Результат
"hello <a href="stackoverflow.com"> <a href="stackoverflow.com/questions/tagged/javascript"> @something </a> </a> and <a href="stackoverflow.com"> <a href="stackoverflow.com/questions/tagged/javascript"> @someone </a> </a> ok"
Это ваша проблема.Чтобы исправить это, вы должны удалить g
из вашего регулярного выражения и удалить @
в замене.Тогда каждая строка будет заменена только один раз правильной ссылкой.Также вы должны изменить свое регулярное выражение.Моя рекомендация
var str = "hello @something and @someone ok";
var link = "stackoverflow.com";
str = str.replace(/@(\w+)/, '<a href="'+link+'"> $1 </a>');
link = "stackoverflow.com/questions/tagged/javascript";
str = str.replace(/@(\w+)/, '<a href="'+link+'"> $1 </a>');