Регулярные выражения, UTF-8, Русский, \b - проблемы

Name

Новичок
Регулярные выражения, UTF-8, Русский, \b - проблемы

$str = "Тестовая строка по русски в UTF-8";
$pattern = "#\bрусски\b#u";
preg_match($pattern, $str, $match);

Не работает. Почему? Что делать? :)


PHP:
$str = "Тестовая строка по русски в UTF-8";

$pattern = "#\bрусски\b#u"; // не работает
$pattern = "#русски#u"; // работает

preg_match($pattern, $str, $match);

echo '<pre>', print_r($match, 1), '</pre>';
 

Zhenya

Новичок
Специальные символы \b \w и т.д. чувствительны к системной локали.
Для правильной обработки необходимо задавать локаль. Например так:

PHP:
setlocale(LC_ALL,"ru_RU.cp1251");
мне помогло, попробуйте...
 

fixxxer

К.О.
Партнер клуба
а локаль на сервере установлена?

и - да, если второй апач, собранный с mpm отличным от prefork, то все что могу посоветовать это выбросить его. правда, в этом случае бы было не "не работает", а "иногда не работает" =)
 

Name

Новичок
locale C

потом ставиться setlocale(LC_ALL, 'ru_RU.utf8', 'ru_RU.utf-8', 'ru_RU');
Apache/1.3.37 (Unix) PHP/5.2.1
 

x-yuri

Новичок
а что setlocale(LC_ALL, 0) выдает после попытки изменить локаль?
 

x-yuri

Новичок
значит нету у тебя на сервере utf-8 или она по-другому называется, например, ru_RU.utf8 (так у меня), не заметил, что у тебя тоже такой вариант есть
shell команда 'locale -a' выдает список установленных локалей
 

Name

Новичок
ну почему нету?
На обоих серверах поставленые locale присутствуют при locale -a

Я проверял на двух серверах, нигде не пашет.

1. setlocale(LC_ALL, 'ru_RU.utf8', 'ru_RU.utf-8', 'ru_RU');
locale ставиться в ru_RU.utf8

2. setlocale(LC_ALL, 'ru_RU.utf8', 'ru_RU.utf-8', 'ru_RU');
locale ставиться в ru_RU.utf-8
 

x-yuri

Новичок
var_dump( setlocale(LC_ALL, 'ru_RU.utf8', 'ru_RU.utf-8', 'ru_RU') );
что выдает?

-~{}~ 10.02.09 23:28:

странно, у меня под Windows работает, а под Unix - нет
 

Name

Новичок
Unix
setlocale(LC_ALL, NULL) = C
setlocale(LC_ALL, 'ru_RU.utf8', 'ru_RU.utf-8', 'ru_RU') = ru_RU.utf8

--------------
Mac
setlocale(LC_ALL, NULL) = C
setlocale(LC_ALL, 'ru_RU.utf8', 'ru_RU.utf-8', 'ru_RU') = ru_RU.utf-8
 

x-yuri

Новичок
Name так чего ж ты на вопрос "а что setlocale(LC_ALL, 0) выдает после попытки изменить локаль?" отвечаешь "C"

по поводу Windows протупил, там, похоже, нельзя utf-8 задать в setlocale

а под Unix у меня тоже не работает

-~{}~ 11.02.09 00:06:

есть подозрение, что поддержка utf-8 не скомпилирована (http://marc.info/?l=php-i18n&m=118303425505336&w=2)
 

phprus

Moderator
Команда форума
x-yuri
есть подозрение, что поддержка utf-8 не скомпилирована (http://marc.info/?l=php-i18n&m=...5505336&w=2)
Я правильно понимаю, что для проверки этого достаточно выполнить код if (!preg_match('/\pL/u', 'a')) die('bastard'); и если он выдаст bastard, то поддержка UTF-8 не скомпилирована?

У меня этот код отрабатывает без ошибок, но пример Name с \b тоже не работает. OS OpenSuSE 11.0, локаль ru_RU.UTF-8. Запускал примеры из консоли.
 

Yaponchick

Новичок
php.net

All the sequences that define a single byte value can be used both inside and outside character classes. In addition, inside a character class, the sequence "\b" is interpreted as the backspace character (hex 08). Outside a character class it has a different meaning (see below).
 
Сверху