Проблема с utf-8, русским языком и mb_eregi_replace

Nick Mitin

Новичок
Проблема с utf-8, русским языком и mb_eregi_replace

PHP 5.1.2/Apache 1.3.33/FreeBSD

пробую сделать так:

PHP:
$string = "тест";
$string = mb_eregi_replace("($string)", "<span style=\"font-weight: bold;\">\\1</bold>", "ТЕСТ");
не находит искомую строку в "ТЕСТ". С английскими символами все ок. И с вариантом:

PHP:
$string = "тест";
$string = mb_eregi_replace("($string)", "<span style=\"font-weight: bold;\">\\1</bold>", "тест");
тоже.

Кодировка UTF-8.
 

kvf77

Red Devil
Nick Mitin

ты уверен, что кодировка utf-8?

как ты это проверял?
 

Nick Mitin

Новичок
я сам туда подсовываю utf-8 строку. в примере константа для простоты понимания.

но я уже даже удостоверялся с помощью
PHP:
mb_detect_encoding($string);
 

440hz

php.ru
вот тут точно UTF-8 и слово "тест" как у тебя в примере.
FreeBSD 5.3-RELEASE
Код:
gw(root)#>cat mb.php
<?

$string = "ТЕСТ";
$string = mb_eregi_replace("($string)", "<span style=\"font-weight: bold;\">\\1</bold>", "это ТЕСТ");

print $string;

?>gw(root)#>php mb.php
это <span style="font-weight: bold;">ТЕСТ</bold>
выглядит так:
Код:
<?

$string = "ТЕСТ"; 
$string = mb_eregi_replace("($string)", "<span style=\"font-weight: bold;\">\\1</bold>", "это ТЕСТ");

print $string;

?>
 

Nick Mitin

Новичок
Я прошу прощения, я полагаю, что ввел всех в заблуждение. Моя проблема заключается в том, что
mb_eregi_replace не работает как заявлено в режиме case insensitive. то есть "тест" на "тест" работает, а "тест" на "ТЕСТ" нет.
 

440hz

php.ru
Nick Mitin
приведи конкретный тест где не работает? или вот этот и не работает?
 

Nick Mitin

Новичок
440hz
приведенный работает. не работает, когда у слов разный регистр, а буковка i в mb_eregi_replace говорит о том, что поиск должен работать без учета регистра.

-~{}~ 27.02.06 16:01:

Не работает:

PHP:
$string = "тест";
$string = mb_eregi_replace("($string)", "<span style=\"font-weight: bold;\">\\1</bold>", "Это ТЕСТ");
 

kvf77

Red Devil
Nick Mitin

ну твою проблему частично можно решить:
устанавливаешь локаль правильно в скрипте setlocale, после чего у тебя начинают правильно работать функции преобразования регистра - при поиске - переводить все данные к одному регистру, скажем, в строчные буквы, искомое тоже приводишь к строчным буквам - и проблем нет.
 

Nick Mitin

Новичок
kvf77 Я уже думал об этом. Я делаю подсветку найденных в тексте слов, и вот как на мой взгляд это будет выглядеть.

1. Перевести весь текст в lower case
2. Найти все искомые слова, запомнть их координаты в тексте.
3. По этим координатам модифицировать оригинальный текст, не забывая о смещениях, вызваных вставкой XHTML кода.

ИМХО оно того не стоит. Пока пользователи проживут без этого.

чтобы не быть голословным.
http://fobo.ru/fobo2/main.php?application.switchForm=fFoBoSearchPosts

(тестовый вариант. Internet Explorerом не смотрите)
 

kvf77

Red Devil
Nick Mitin

кстати, у меня preg_replace помоему всегда нормально работали с unicode - попорбуй их - там есть модификатор специальный, говорящий, что строка в юникоде и помоему работает он правильно
 

Nick Mitin

Новичок
kvf77, спасибо! решение найдено:
PHP:
$string = "тест";
$string = preg_replace("/($string)/iu", "<span style=\"font-weight: bold;\">\\1</bold>", "Это ТЕСТ");
 
Сверху