Yup, you'll have to use the /e option to eval the replacement. Give me five minutes and I'll post the solution.
EDIT: Dammit - I want to solve this whole thing on one line but I'm have trouble with escaping quotes in the eval'd code - will go multiline if necessary, but still working on it.
Ok - give this a whirl, as you can see, I've had to add the php tags for highlight_string to work and I've change the tags away from the norm to stop this interpreter messing it up
$pat1 = '%\[PEEHP](.*)\[/PEEHP]%iUse';
// you have to add the php tags on if they haven't
$sub1 = "highlight_string('<?php ' . stripslashes('\\1') . '?>', 1);";
$str = preg_replace($pat1, $sub1, $str);
echo $str;