Используйте класс \ p {P}, который соответствует любому знаку препинания в Юникоде, в сочетании с классом \ s пробелов.
$result = preg_split('/((^\p{P}+)|(\p{P}*\s+\p{P}*)|(\p{P}+$))/', $text, -1, PREG_SPLIT_NO_EMPTY);
Это разделит группу из одного или нескольких пробельных символов, но также засосет любые окружающие знаки препинания. Он также соответствует знакам препинания в начале или конце строки. Это различает такие случаи, как «не» и «он сказал: ой!»