I guess you seen the problem, or maybe facing with it at the moment. So if you echo the string with pre tags, it will show normally. But without pre tags, it shows ugly... just like a plain text.
The problem is that there is hidden new lines symbols like /r or /n and so on...
Just by replacing the with str_replace is not enough. So here solution for it:
$value = preg_replace('/[\r\n]+/', '\n', $value);