Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: баг в substr
Форумы портала PHP.SU » PHP » Программирование на PHP » баг в substr

Страниц (1): [1]
 

1. Ch_chov - 24 Сентября, 2008 - 08:18:58 - перейти к сообщению
Кто нибудь сталкивался с этим ?
http://bugs.php.net/bug.php?id=45311
Как то можно его обойти?
Или заменить substr другой функцией?
2. valenok - 24 Сентября, 2008 - 10:29:23 - перейти к сообщению
Поставить более новую версию php =)
(Добавление)
А если обращаться к строке через отдельные буквы ? Тоесть echo $data[0].$data[1] ;
3. Ch_chov - 24 Сентября, 2008 - 11:18:36 - перейти к сообщению
На хостинге PHP 5.2.6 и пропатчить нет возможности.
Цитата:
А если обращаться к строке через отдельные буквы ?

Мне кажется это приведет к значительному увеличению времени работы скрипта.
Функция substr находится во вложеном цикле.
4. Джур - 24 Сентября, 2008 - 13:00:38 - перейти к сообщению
несовсем понял... где тут ошибка... хм...

substr с utf8 работает неправильно и это нормально...
mb_substr с utf8 работает и это правильно...

Но вот за каким лешим в utf8 строчку пихать не utf-ные символы я недопонимаю. Это же не простой набор байтов.

Ch_chov уточните плиз что вам сделать надо.
5. Ch_chov - 24 Сентября, 2008 - 14:12:02 - перейти к сообщению
Я так понял, что баг проявляется тогда, когда смешиваются данные в разных кодировках.
Цитата:
Проблема заключается в том, что в PHP 5.2.6 функции mb_substr() и substr() некорректно вырезают часть данных, если эти данные имеют хоть один символ кириллицы, не закодированный в UTF8.

Цитата отсюда: http://forum[dot]vingrad[dot]ru/forum/s/[dot][dot][dot]opic-226758[dot]html

Я сам не могу понять почему так происходит, у меня везде используется только ANSI
Причем баг проявляется не постоянно, а периодически 2-3 раза в сутки.
В том что глючит именно substr установил точно.
6. valenok - 24 Сентября, 2008 - 15:08:32 - перейти к сообщению
Тоесть у вас не бинарные данные вовсе ???
7. Ch_chov - 24 Сентября, 2008 - 17:31:17 - перейти к сообщению
Нет не бинарные и не UTF.
Обычная строка с кириллицей.
8. valenok - 24 Сентября, 2008 - 21:42:31 - перейти к сообщению
Тогда чего то вы не то рассказываете про баги. Там дело совсем в другом. Код показывайте.
9. Ch_chov - 25 Сентября, 2008 - 12:00:51 - перейти к сообщению
Я думаю, что если в строке есть кирилица, не закодированная в UTF8, то substr воспринимает ее как бинарные данные. Поэтому описанный баг распостраняется и на этот случай. На локальном компе стоит PHP 4.4.0 и ни каких глюков не разу не было.

Скрипт представляет собой обычный шаблонизатор. В строку $str_cont_old загружется содержимое базового шаблона из файла, затем в теле цикла происходит поиск шаблонов заключенных в фигурные скобки и замена их содержимым соответствующего файла.

Вот код:
PHP:
скопировать код в буфер обмена
  1.  
  2. //$str_cont_old  - исходная строка с HTML кодом и шаблонами
  3. //$str_cont_new - готовая строка для выдачи в браузер
  4.  
  5.  
  6. $e=0;
  7. while(true) {
  8.         if(!$b=strpos($str_cont_old,'{',$e)) break; //Позиция откр. фиг. скобки.
  9.         $e=strpos($str_cont_old,'}',$b); //Позиция закр. фиг. скобки
  10.  
  11.   //Считываем то что находится между скобками
  12.         $tname=substr($str_cont_old, $b+1, $e-$b-1);
  13.        
  14.                 ........
  15.             ........
  16.             ........
  17.  
  18.  //Производим замену
  19.         $str_cont_new=str_replace('{'.$tname.'}' ,$cont_inc_tpl, $str_cont_new);
  20. }


Опытным путем установил, что в момент когда происходит ошибка strpos совершенно верно находит позиции открытой и закрытой скобок. А вот substr начинает считывать название шаблона не с $b+1 а на несколько символов дальше.
Например:
После обработки такого участка строки
'...<title>{title}</title>...'
функция substr должна вернуть имя шаблона $tname='title', а вместо этого я получаю $tname='/titl'
10. valenok - 25 Сентября, 2008 - 17:33:07 - перейти к сообщению
А зачем вам искать чьи то позиции ? Нельзя просто заменять содержимое квадратных скобок на то что надо ?
11. Ch_chov - 25 Сентября, 2008 - 17:58:10 - перейти к сообщению
Цитата:
А зачем вам искать чьи то позиции ? Нельзя просто заменять содержимое квадратных скобок на то что надо ?


Не квадратных, а фигурных. Нахмурился

Каким образом заменять? Я перерыл все строковые функции на этот счет.

 

Powered by ExBB FM 1.0 RC1