$text = preg_replace('/(?<! [a-z]| [a-z]{2})\.(?! |\d|\.)/i', '. ', $text);
See it here in action: http://regex101.com/r/zE4pI4
This can get even more complicated if you want to take into account initials at the beginning of your text (see here how it fails). Since the lookbehind has to be fixed length, you'll have to create a separate lookbehind for that:
/(?<! [a-z]| [a-z]{2})(?<!\b[a-z]|\b[a-z]{2})\.(?! |\d|\.)/
See it here in action: http://regex101.com/r/pH1mZ5