Flasher: $1 заменяется на содержимое группы, которая обозначена в скобках. То есть regexp полностью такой же, как у вас в условии(непонятно зачем вы только используете ограничитель по символу для собаки, если у вас там только 1 символ и есть - собака). Не нравится с группами, можно так:
preg_replace_callback('/@[\w]+/u', function($matches){ return ''. $matches[0] . '';}, $string);
результат будет тот же.
Wol_fi: ругается <?php echo preg_replace('/[@][\w]+/u', '$1', $content->message); ?>, пишет, что syntax error, unexpected '1.' Наверно я не так, что-то делаю?
Flasher: да, скобки не добавили. $1 - это означает номер группы, в данном случае такой регексп нужен
/(@][\w]+)/u, $1 будет означать, что будет взять содержимое из первой группы (@][\w]+)