X

CentOS, PCRE и регистронезависимый поиск

Вчера столкнулся с проблемой: не работал модификатор "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 ) подробно описывается как собрать пакет самостоятельно, но так же предоставляется возможность и скачать уже готовый пакет:

следующим шагом, необходимо установить этот пакет:

# 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

В случае, если у Вас не получилось, почитайте отзывы других людей в комментариях к исходному посту.

Категории: Linux Бездна
Тэги: centospcre

Комментарии (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
    ваш скрипт выдает :

    Locale: ru_RU.utf8
    Internal encoding: UTF-8
    Regexp encodiung: UTF-8
    Text encoding UTF-8
    -------------------
    Test 1 ... ERR
    Test 2 ... ERR

    не работают регулярки на сайте, не могу понять почему

    c PCRE все правильно

    • 1) проверь на всякий случай еще раз PCRE:
      в консоли:
      $ pcretest -C
      пишет: Unicode properties support ?

      2) проверь в какой кодировке сохранен мой файл, должна быть UTF-8 Without BOM. Глянуть можно, например, в Notepad++.

      3) посмотри есть ли вообще русские локали на сервере:
      в консоли
      $ locale -a | grep ru

      Если ничего из этого не помогло, то к сожалению, мне в голову больше ничего не приходит :(

      Когда найдешь решение, и будет минутка, напиши его тут или оставь ссылку на пост в своем блоге.