CentOS, PCRE и регистронезависимый поиск
Вчера столкнулся с проблемой: не работал модификатор "i" в регулярном выражении. Этот модификатор отвечает за регистронезависимый поиск..
С похожей проблемой я уже сталкивался, и описывал её тут: PCRE и регистронезависимый русский поиск, однако на этот раз этот рецепт не сработал.
Для тестов я написал такой простой пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$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, неправильно скомпилирован. Проверить это можно такой командой:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ 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 |
В "правильной" версии первые две строчки должны сообщать:
1 2 3 4 |
UTF-8 support Unicode properties support |
Если это не так, то необходимо скомпилировать PCRE с ключами:
1 2 3 4 |
–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
следующим шагом, необходимо установить этот пакет:
1 2 3 |
# rpm -Uvh ~/src/rpm/RPMS/x86_64/pcre-6.6-2.7.x86_64.rpm |
после этого, можно сново проверить, все ли в порядке и должны увидеть такой результат:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ 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 |
В случае, если у Вас не получилось, почитайте отзывы других людей в комментариях к исходному посту.
Author: | Tags: /
| Rating:
10 comments.
Write a comment