С регулярными выражениями ты не понимаешь, как оно пашет.
А это очень плохо.
"нормально пашет" - это фигня. Не нужно, чтобы работало.
Нужно, чтобы ты понимал, как оно работает.
Ты и так-то не понимаешь, что делает твой скрипт.
К примеру, при записи строки в базу, ты руками добавляешь этот самый перевод строки, вот здесь:
fwrite($f, "$date|$theme|$message|$author|\n");
то есть, все твои страхи по поводу последнего незамененного перевода строки - беспоченные.
Надо не чтобы "пахало", а чтобы ты понимал - как именно пашет, и почему.
Поэтому надо пользоваться простыми, но понятными конструкциями.
иначе ты будешь делать другой скрипт, и воткнешь непонятную конструкцию не на то месо. Как попытался сейчас поступить с htmlspecialchars