preg_replace ("/(\p{P})/", ' ', $str) удаляет апострофы, и не должно. Пожалуйста, помогите
preg_replace ("/(\p{P})/", ' ', $str)
Попробуйте это:
/\p{P}(?<!')/
Дополнительное утверждение о том, что знак пунктуации не является апострофом.