it uses zero-width look behind for the "<?" and zero width negative look ahead for the "php".
And using grep (in perl mode):
grep -P "\<\?(?!php)" -r .
YES <? asdf
And a quick shell script for fixing a file (I say "quick" because it doesn't always work - e.g. if you have "<?/* comment */?>" it doesn't put in the extra whitespace you need after the "<?php"):
sed 's/<?=/MAGICaaxo3ohW/' | sed 's/<?php/<?/g' | sed 's/<?/<?php/g' | sed 's/MAGICaaxo3ohW/<?php echo/'