Почему не работает регистронезависимость регулярного выражения в php?

Не работает регистронезависимость (флаг i) в регулярном выражении после переноса на новый хостинг. Кодировка windows-1251.

И текст и файл в нужной кодировке. Какой-то настройки не хватает на сервере?

$text = 'что-то написано ТЕКСТ что-то написано';
echo preg_replace('#текст#si', '', $text);
// выводит оригинальную строку из $text, ничего не вырезано


$text = 'что-то написано ТЕКСТ что-то написано';
echo preg_replace('#ТЕКСТ#si', '', $text);
// выводит строку с вырезанным ТЕКСТ.

Хоть флаг i указан, регулярка реагирует на регистр символов. Почему?


Ответы (2 шт):

Автор решения: Daniel Protopopov

В итоге получается вот что - чтобы найти регистро-независимую UTF-8 строку нужно добавить u флаг (как и сказал @u_mulder). Для того чтобы найти строку того же регистра флаг добавлять не нужно так как идёт сравнение символов 1-в-1, в то время как в регистро-независимом сравнении этого не получится, так как код конвертирует текст в ASCII (?) кодировку и приведет к нижнему регистру, не найдя нужных совпадений для замещения.

 <?php
 $text = 'что-то написано ТЕКСТ что-то написано';
 echo preg_replace('#текст#usi', '', $text); // Заместит с /u флагом

 $text = 'что-то написано ТЕСТ что-то написано';
 echo preg_replace('#ТЕСТ#si', '', $text); // Заместит 1-к-1
→ Ссылка
Автор решения: Роман Морозов

В итоге решилось установкой локали на сервере.

На старом сервере locale -a выдавало много локалей разных, там где-то и cp1251 наверно есть. На новом сервере locale -a выдавало только 3 штуки и все utf-8.

В файле /etc/locale.gen раскомментировал ru_RU.cp1251, после выполнил команду locale-gen

Команда locale -a вывела в списке и ru-RU.CP1251. После всё заработало, setlocale в php не добавлял, флаги не менял, php вообще не трогал

→ Ссылка