Почему не работает регистронезависимость регулярного выражения в php?
Не работает регистронезависимость (флаг i) в регулярном выражении после переноса на новый хостинг. Кодировка windows-1251.
И текст и файл в нужной кодировке. Какой-то настройки не хватает на сервере?
$text = 'что-то написано ТЕКСТ что-то написано';
echo preg_replace('#текст#si', '', $text);
// выводит оригинальную строку из $text, ничего не вырезано
$text = 'что-то написано ТЕКСТ что-то написано';
echo preg_replace('#ТЕКСТ#si', '', $text);
// выводит строку с вырезанным ТЕКСТ.
Хоть флаг i указан, регулярка реагирует на регистр символов. Почему?
Ответы (2 шт):
В итоге получается вот что - чтобы найти регистро-независимую 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 вообще не трогал