Вы можете использовать регулярные выражения с обратным вызовом - так что сопоставьте то, что находится между тегами кода, а затем замените, выполнив функцию.
Что-то вроде этого непроверенного кода:
$str = preg_replace_callback('/(\[code.+?\])(.+?)(\[\/code\])/', create_function(
'$m',
'return $m[1] . htmlentities($m[2]) . $m[3];'
),$str)