La expresión la tenia bien; lo que me fallaba eran los espacios al realizar el foreach; la solución que hice:
Cita: function reemplazarHastacks($c) {
$c = " " . $c . " ";
$regex = "/(@|#)\w+/i";
$encontrado = preg_match_all($regex, $c, $resultados, PREG_SET_ORDER);
if ($encontrado) {
foreach ($resultados as $resultado) {
$c = str_replace(" " . $resultado[0] . " ", " <a class='hastack'>" . $resultado[0] . "</a> ", $c);
}
}
return $c;
}