php 5.4, регулярка и точное вхождение

12 3
LEOnidUKG
На сайте с 25.11.2006
Offline
1774
1514

В php 5.2.17 отлично работал вот такой код:

$description='привет как дела';

$description=preg_replace('@\bкак\b@', 'никак',$description);

echo $description;

В PHP 5.4 он нифига не заменяет, ни ошибок, ничего, просто не срабатывает. Никто не сталкивался? В поиске тишина.

---------- Добавлено 17.10.2013 в 12:59 ----------

Опытным путём выяснил, что русские буквы именно так не хочет обрабатывать.

Кодировка win1251 стоит.

Без \b отлично обрабатывает.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
[umka]
На сайте с 25.05.2008
Offline
456
#1

Может, локалю нужно указать?

Лог в помощь!
LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#2
'[umka:
;12246840']Может, локалю нужно указать?

Да всё уже указал, пачкой:

mb_http_input('windows-1251');

mb_http_output('windows-1251');

mb_internal_encoding("windows-1251");

setlocale(LC_ALL, 'ru_RU.CP1251');

Не имеет смысла. При этом, что именно с \b не хочет работать. В чём фокус.

[umka]
На сайте с 25.05.2008
Offline
456
#3

То есть, например, \w оно принимает за букву?

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#4
'[umka:
;12246874']То есть, например, \w оно принимает за букву?

\w если только опять же по бокам английские буквы

А вот \W отлично кушает. Конечно только приходиться менять кучу шаблонов для вывода т.к. он всё что по бокам скушает.

---------- Добавлено 17.10.2013 в 13:17 ----------

Но проблема остаётся, с чего это вдруг \b перестало обрабатываться.

---------- Добавлено 17.10.2013 в 13:19 ----------

О прикол. В UTF-8 отлично обрабатывает :D

[umka]
На сайте с 25.05.2008
Offline
456
#5

Значит, проблема с локалью.

У меня вот такой вариант не работает (обе реги)


$str="это как так?";
echo preg_replace("/\bкак\b/", "никак", $str);
echo preg_replace("/ка\w/", "никак", $str);

А вот такой вариант работает (обе реги):


setlocale(LC_CTYPE,"ru_RU.CP1251");
$str="это как так?";
echo preg_replace("/\bкак\b/", "никак", $str);
echo preg_replace("/ка\w/", "никак", $str);
LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#6
'[umka:
;12246926']Значит, проблема с локалью.
У меня вот такой вариант не работает (обе реги)

$str="это как так?";
echo preg_replace("/\bкак\b/", "никак", $str);
echo preg_replace("/ка\w/", "никак", $str);


А вот такой вариант работает (обе реги):

setlocale(LC_CTYPE,"ru_RU.CP1251");
$str="это как так?";
echo preg_replace("/\bкак\b/", "никак", $str);
echo preg_replace("/ка\w/", "никак", $str);

На винде с 5.4?

---------- Добавлено 17.10.2013 в 13:32 ----------

Сработала вот такая установка:

setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251');

НО... как это по умолчанию то выставить. Скриптов много.

[umka]
На сайте с 25.05.2008
Offline
456
#7
LEOnidUKG:
На винде с 5.4?

Ой не, не на винде.

Но если на винде это пускать, то там тоже должны быть локали, которые где-то лежат и доступны для чтения.

Если скрипт не работает, значит, у пхп не получается прочитать локаль.

LEOnidUKG:
Сработала вот такая установка:

setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251');

Значит, по-другому называются в виндовсе :)

LEOnidUKG:
НО... как это по умолчанию то выставить. Скриптов много.

Вы меня конфузите такими вопросами ))

Или скриптом или в системе выставить или в php.ini или в .htaccess

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#8

Всё короче.

Достаточно просто в php.ini прописать: default_charset = "CP1251"

Остальная проблема вылилась из того, что apache не перезагрузился. Пришлось убивать и заново стартовать.

---------- Добавлено 17.10.2013 в 13:40 ----------

'[umka:
;12246978']
Вы меня конфузите такими вопросами ))
Или скриптом или в системе выставить или в php.ini или в .htaccess

Да я сам тут сконфузился. Думал неужели в php5.4 по другому что-то замутили 😂

А это сволочуга апатч 😂

---------- Добавлено 17.10.2013 в 14:47 ----------

Так, рано радовался. Всё не так просто.

default_charset = "CP1251" чуть не то. Если в скрипте не установить локаль, то она не срабатывает.

Ок, вопрос на засыпку. Как в php.ini прописать локаль?

Модуль intl не срабатывает, библиотека подключена.

Ещё варианты?

---------- Добавлено 17.10.2013 в 14:49 ----------

Проверяю phpinfo()

intl.default_locale Russian_Russia.1251

Всё ок, НО пока в скрипте я не пропишу: setlocale(LC_ALL, 'Russian_Russia.1251');

Регулярка не сработает. В чём прикол?

[umka]
На сайте с 25.05.2008
Offline
456
#9

Да, действительно, работает только после setlocale() и никакие шаманства с php.ini и .htaccess воздействия не имеют.

Во всяком случае, у меня тоже не получилось установить дефолтную локаль.

---------- Добавлено 17.10.2013 в 13:37 ----------

Как вариант, сделать в php.ini или в конфиге виртуалхоста костыль в виде auto_prepend_file.

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#10
'[umka:
;12247428']
Как вариант, сделать в php.ini или в конфиге виртуалхоста костыль в виде auto_prepend_file.

Это последнее о чём я думаю. Как оно всё работало в 5.2 не понимаю. И что в 5.4 версии не смогли сделать установку локали. Да это нонсенс.

---------- Добавлено 17.10.2013 в 15:45 ----------

не ну умора в том, что переводим код в utf-8 и всё начинает работать. Никаких локалей не нужно.

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий