Вчера столкнулся с проблемой: не работал модификатор "i" в регулярном выражении. Этот модификатор отвечает за регистронезависимый поиск..
С похожей проблемой я уже сталкивался, и описывал её тут: PCRE и регистронезависимый русский поиск, однако на этот раз этот рецепт не сработал.
Для тестов я написал такой простой пример:
$text = "Наименование: Женские сапоги"; $masks = array( '|женские|i', '|женские|iu', // '~[ж|Ж]енские~i', // '~[ж|Ж]енские~iu', ); // ============================================== echo 'Locale: '.setlocale(LC_ALL, 'ru_RU.utf8').PHP_EOL; mb_internal_encoding('UTF-8'); echo 'Internal encoding: '.mb_internal_encoding().PHP_EOL; mb_regex_encoding('UTF-8').PHP_EOL; echo 'Regexp encodiung: '.mb_regex_encoding().PHP_EOL; echo 'Text encoding '. mb_detect_encoding($text).PHP_EOL; echo '-------------------'.PHP_EOL; foreach ($masks as $k=>$m) { echo 'Test '.($k+1).' ... '; if ( preg_match($m, $text) ) { echo '>>> OK <<<'; } else { echo 'ERR';} echo PHP_EOL; }
Выполнение примера, говорило о том, что с кодировками все впорядке, однако пример по прежнему не работал.
После нескольких часов поиска, я набрел вот на этот пост: Unicode Support on CentOS 5.2 with PHP and PCRE в котором говорится, что проблема в том, что PCRE, неправильно скомпилирован. Проверить это можно такой командой:
$ pcretest -C PCRE version 6.6 06-Feb-2006 Compiled with UTF-8 support No Unicode properties support Newline character is LF Internal link size = 2 POSIX malloc threshold = 10 Default match limit = 10000000 Default recursion depth limit = 10000000 Match recursion uses stack
В "правильной" версии первые две строчки должны сообщать:
UTF-8 support Unicode properties support
Если это не так, то необходимо скомпилировать PCRE с ключами:
–enable-utf8 –enable-unicode-properties
По указанной выше ссылке ( Unicode Support on CentOS 5.2 with PHP and PCRE ) подробно описывается как собрать пакет самостоятельно, но так же предоставляется возможность и скачать уже готовый пакет:
- для 32: Thanks Robin for providing a 32-bit version: pcre-6.6-2.7.i386.rpm
- для 64: pcre-6.6-2.7.x86_64.rpm – PCRE 6.6 for CentOS 5.2 64-bit
следующим шагом, необходимо установить этот пакет:
# rpm -Uvh ~/src/rpm/RPMS/x86_64/pcre-6.6-2.7.x86_64.rpm
после этого, можно сново проверить, все ли в порядке и должны увидеть такой результат:
$ pcretest -C PCRE version 6.6 06-Feb-2006 Compiled with UTF-8 support Unicode properties support Newline character is LF Internal link size = 2 POSIX malloc threshold = 10 Default match limit = 10000000 Default recursion depth limit = 10000000 Match recursion uses stack
В случае, если у Вас не получилось, почитайте отзывы других людей в комментариях к исходному посту.
Комментарии (10)
У меня еще месяц предоплачен.
Я новичок в администрировании, поэтому и переезжаю, на все времени не хватает.
Версии совпадают.
Решил не тратить свое время дальше и взять зарубежный шаред.
Самое интересное, что скрипты работали в прошлом году, я изменений никаких не вносил в настройку сервера, с сайтами работал под юзером. Админы клянутся, что ничего не трогали. Единственное что произошло, сервак упал без видимых причин. Может железо старое, так как vps дешевенький, хрен его знает.
На мой взгляд, очень похоже на обновление какого-то пакета (возможно автоматическое) и его не правильная конфигурация, например скомпилирован не с теми параметрами. К сожалению, подобные проблемы надо рассматривать, в контексте конкретного сервера, и очень трудно что-то определить "на расстоянии".
Я последнее время, беру сервера и VPS на Debian-е. Там, пока что, все работает из коробки. С CentOs-ом сталкиваюсь периодически на серверах заказчиков и там бывают подобные "мелкие" неприятности, когда вроде все правильно настроено и работает, однако есть проблемки. Разумеется, я не исключаю свою некомпетентность в настройке серверов, однако такое происходит.
Кстати, если ты переехал на шаред и сервер остался пустой, можешь попробовать полностью удалить pcre, веб-сервер, php, поставить и сконфигурировать их заново.
Попробуй ещё, проверить версии модуля pcre:
а) создаем файлик php с содержимым и открываем в броузере
<?php
phpinfo();
?>
б) выполняем в консоли:
php -r "phpinfo();" | grep PCRE
должны совпадать, что-то вроде:
PCRE Library Version => 8.12 2011-01-15
если не совпадают, тогда вот тут написано как исправить:
phpinfo is reporting incorrect pcre version
стили для code поправь, в style.css добавить
code {
display: block;
margin: 1em 0 1em 15px;
padding: 5px ;
}
Исправлено, спасибо!
1. все отлично
2. да, было в ansi. Результат в utf-8 без bom
Test 1 ... ERR Test 2 ... >>> OK <<<
3. изначально была локаль russian, сейчас ru_RU.cp1251
вот результат locale -a | grep ru
-bash-3.2# locale -a | grep ru
ru_RU
ru_RU.cp1251
ru_RU.iso88595
ru_RU.koi8r
ru_RU.utf8
ru_UA
ru_UA.koi8u
ru_UA.utf8
russian
Второй тест прошел. Это значит, что уже не все так плохо, можно использовать модификатор "u" к регуляркам. Он говорит, что строки надо воспринимать как UTF-8.
Дано vps CentOS 5.6 64-bit , php 5.2.17
ваш скрипт выдает :
не работают регулярки на сайте, не могу понять почему
c PCRE все правильно
1) проверь на всякий случай еще раз PCRE:
в консоли:
$ pcretest -C
пишет: Unicode properties support ?
2) проверь в какой кодировке сохранен мой файл, должна быть UTF-8 Without BOM. Глянуть можно, например, в Notepad++.
3) посмотри есть ли вообще русские локали на сервере:
в консоли
$ locale -a | grep ru
Если ничего из этого не помогло, то к сожалению, мне в голову больше ничего не приходит :(
Когда найдешь решение, и будет минутка, напиши его тут или оставь ссылку на пост в своем блоге.