Safe enough catch-all in utf-8 / unicode:
preg_match_all('/#([\p{L}\p{Mn}]+)/u',$string,$matches); var_dump($matches);
Although, if you are not using / not expecting exotic characters, this may work equally well and is more readable:
preg_match_all('/#(\w+)/',$string,$matches);
source share