Первоначально, я бы пошел с этим (Unicode Safe)
$newString = preg_replace('/[^\p{L}\p{N}]/u', ' ', $oldString);
Если вы хотите оставить существующие, несколько пробелов в одиночку ...
$newString = preg_replace('/[^\p{L}\p{N}\s]/u', ' ', $oldString);
Если вы хотите сжать последовательные не буквенно-цифровые символы в один пробел, измените его на
$newString = preg_replace('/[^\p{L}\p{N}]+/u', ' ', $oldString);
// note the + sign