str_ireplace() и кириллица

mfl
На сайте с 16.10.2006
Offline
134
mfl
4325

В общем код:

<?php

$text="ЯблОКо1 ЯБЛОКО1 яблоко1 fo FO <br/>";
// устанавливаем русскую локаль
setlocale(LC_ALL, array("ru_RU.CP1251", "ru_SU.CP1251", "ru_RU", "russian", "ru_SU", "ru"));

// проверяем функции рег.выражений
print preg_replace("~я~i", "*", $text);

// проверяем строковые функции
print strtolower($text);

// проверяем str_ireplace
print str_ireplace("яб", "*", $text);
print str_ireplace("f", "*", $text);

// теперь внимание: проверяем str_ireplace с заменой одного символа кириллицы
print str_ireplace("я", "*", $text);
?>

Вот что на выходе (обращаем внимание на последнюю строку):

*блОКо1 *БЛОКО1 *блоко1 fo FO
яблоко1 яблоко1 яблоко1 fo fo
*лОКо1 *ЛОКО1 *локо1 fo FO
ЯблОКо1 ЯБЛОКО1 яблоко1 *o *O
ЯблОКо1 ЯБЛОКО1 *блоко1 fo FO

т.е. функция становится чувствительна к регистру символов кириллици.

От сюда вопрос, из за чего такое поведение функции?

Если проблема с локалью, почему тогда остальные функции работают корректно?

PB
На сайте с 05.04.2006
Offline
51
#1

mfl,

Вы знаете, она вообще какая-то дурацкая, эта str_replace. Пользуйтесь прегом.

Сайт находится в разработке. (http://www.e-anatomy.ru)
mfl
На сайте с 16.10.2006
Offline
134
mfl
#2

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

На php4 приходилось пользоваться прегом, но теперь есть php5 и это чудо str_ireplace(), которое совсем не требовательно к ресурсам по сравнению с функциями регулярных выражений.

PB
На сайте с 05.04.2006
Offline
51
#3

mfl, Претензий нет ???

Посмотрите, как работает Ваш код: http://se-car.ru/test/1.php

и почитайте http://ru2.php.net/str_replace

Там в красноватой рамочке.

mfl
На сайте с 16.10.2006
Offline
134
mfl
#4

Претензий нет именно к str_replace() - регистрозависимая фуннкция

К str_ireplace() - регистронезависимой функции, как раз есть претензии, указанные в первом посте.

По поводу http://se-car.ru/test/1.php

str_ireplace() была введена только в php5, этот скрипт работает на PHP/4.4.4, следовательно при встрече неизвестной функции str_ireplace скрипт прекращает работу.

А кроме тех ошибок, что указаны на http://ru2.php.net/str_replace еще ошибки есть?

Как видим начиная с php 4.3.3 ошибка была исправлена.

YuraZ
На сайте с 05.06.2006
Offline
95
#5
*блОКо1 *БЛОКО1 *блоко1 fo FO
яблоко1 яблоко1 яблоко1 fo fo
*лОКо1 *ЛОКО1 *локо1 fo FO
ЯблОКо1 ЯБЛОКО1 яблоко1 *o *O
*блОКо1 *БЛОКО1 *блоко1 fo FO

php 5.2.5 на локалхосте под виндами, если вы тоже под виндами проверяли, только локаль ставил я привычным проверенным вариантом :) setlocale(LC_ALL, 'ru_RU.CP1251', 'ru_RU', 'rus');

mfl
На сайте с 16.10.2006
Offline
134
mfl
#6
YuraZ:
setlocale(LC_ALL, 'ru_RU.CP1251', 'ru_RU', 'rus');

Локаль можно и так устанавливать значения не имеет.

Если в качестве locale передан массив, или после этого аргумента следуют дополнительные аргументы, функция будет использовать элементы массива или аргументы по порядку в качестве имен локали до тех пор, пока установка локали не будет успешной.

Проверил под виндой, отображается правильно.

Теперь из-за чего возможно такое поведение функции?

Каким образом можно заставить правильно работать её под Unix?

DyaDya
На сайте с 11.04.2007
Offline
147
#7

Да, реально какой-то странный глюк. С другими буквами, например, "б" аналогичная чушь.

Попробуйте на phpclub.ru об этом написать (пожалуй, там лучше спецы ;) ). Очень похоже на косяк, а не на проблемы с кодировками.

Выбирайте качественный хостинг (http://vashmaster.ru/informaciya/o_poleznyh_programmah/news83.php) и продвигайте сайты в СЕОПУЛЬТ (http://seopult.ru/ref.php?ref=72b5ed9561fe66a1). А на «SAPE» я в обиде :) Не упрекайте за очепятки, пишу вслепую (http://ergosolo.ru/) и также делаю сайты (http://www.vashmaster.ru/) ;)

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