preg_replace не понимает мультибайтовые кодировки, и воспринимает символы просто как набор байт, соответственно он может найти искомый символ к примеру на пересечении двух символов, где конец первого и начало второго символа случайно совпали с искомым символом (что произойдет с этими двумя символами или всей строкой после можете сами догадаться).
Я периодически вижу в интернете странные попытки настраивать локаль и использовать модификатор u и говорят даже работает, но документации для этого мне найти не удалось
Но зато есть штатный механизм работы с кодировками - это расширение
Multibyte String, пользуйтесь им и все будет работать как ожидается. В частности использовать нужно
mb_ereg_replace