Иметь код, который получает текстовый файл, заменяет разрывы строк, затем ссылки и затем хэш-теги.
Когда хэш-тег следует за разрывом строки, он не заменяет хэш-тег. Не уверен, где в regrex это терпит неудачу.
// replace line breaks
$txt = str_replace('<br />','<br />',$txt);
// replace links
$txt = preg_replace_callback('@(https?://([-\w\.]+)+(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)?)@', function($m) { return '<a href="'.$m[1].'" target="_blank">'.substr($m[1], 0, 30).'...</a>'; }, $txt);
// replace hashtags
$txt = preg_replace('/(?<!\S)#([0-9a-zA-Z]+)/m', '<a href="index.php?q=$1">#$1</a>', $txt);