В PHP много функций для работы с регулярными выражениями, но если вы применяете их к кириллическим и любым другим символам за пределами ASCII в формате Unicode, это в обязательном порядке нужно указывать в ключах режима регулярного выражения.
Я столкнулся с этим случайно, когда пытался перебрать регекспом свои имя, отчество и фамилию на предмет наличия небуквенных символов. Каково же было моё удивление, когда preg_replace упорно портил моё отчество, заменяя целых 3 буквы знаками вопроса, а имя и фамилию почему-то не трогал. Только добавив модификатор Unicode «/u», я получил правильный результат:
preg_replace('/[^A-Za-zА-Яа-яЁё]/u', '', $_POST['name']);