ok.
you have a string, mixed with html and php, right?
you cant just print it, and expect the server to know automatically that it has php code to run.
nl2br outputs a string, and every time it see's a linebreak, it prints a br.
eval outputs a string, and it expects it to be php code, so attempts to run it.
there are other factors to take into account when preparing a string for eval() use, primarily that you cannot pass anything but php to an eval statement. you cannot parse a html/php mixed string with eval alone.
probably what you need to do is strip out the php and run it seperately wherever it occurs.
you could do this using ereg, and whenever it finds php (identified by the php tags), do an eval on the statements.
www.php.net/eval will tell you all you need to know regarding running a string as code.