truncate функция падает с ошибкой Warning: mb_strpos(): Offset not contained in string

Статус
В этой теме нельзя размещать новые ответы.

Sahh

Постоялец
Регистрация
5 Апр 2014
Сообщения
169
Реакции
135
в логе magento получаю ошибку
Код:
2016-12-05T15:47:45+00:00 ERR (3): Warning: mb_strpos(): Offset not contained in string  in /Users/xxx/Documents/SourceTree Repository/app/code/local/TypoStores/Widget/Block/Widget.php on line 279

код из файла Widget.php строки 276-281
PHP:
    public function truncate($string, $chars = 50, $terminator = ' ...')
    {
        $cutPos = $chars - mb_strlen($terminator);
        $boundaryPos = mb_strrpos(mb_substr($string, 0, mb_strpos($string, ' ', $cutPos)), ' ');
        return mb_substr($string, 0, $boundaryPos === false ? $cutPos : $boundaryPos) . $terminator;
    }
мне кажется что в коде просто описка добавленна одна R - mb_strrpos в код на строке 279
если я меняю mb_strrpos на mb_strpos ошибка больше не появляется в логе

Прав ли я или проблема в другом?
 
Обе функции имеют место быть и выполняются с небольшим отличием, ругается у тебя на mb_strpos с одной r. И более того при твоей замене всегда будет оставлять только 1 слово от предложения.
Лучше строку (или все аргументы функции) приведи, при которой возникает эта ошибка.
 
  • Нравится
Реакции: Sahh
Лучше строку (или все аргументы функции) приведи, при которой возникает эта ошибка.
Спасибо за столь быстрый ответ.
этот кусок кода используется ещё в одном файле (data.php) со строки 435

"mb_strpos" есть ещё в файле Strings.php (это файл модуля от amasty) возможно из за этого появились ошибки в логе
PHP:
    /**
     * @param      $haystack
     * @param      $needle
     * @param null $offset
     *
     * @return int
     */
    public function strpos($haystack, $needle, $offset = null)
    {
        return function_exists("mb_strpos") ? mb_strpos($haystack, $needle, $offset, $this->_defaultEncoding) : strpos($haystack, $needle, $offset);
    }

вот эти файлы целиком
 

Вложения

  • Widget.php.zip
    5 KB · Просмотры: 1
  • Data.php.zip
    5,1 KB · Просмотры: 1
  • Strings.php.zip
    2,8 KB · Просмотры: 1
Последнее редактирование:
Я немножко другую инфу просил, ну да ладно :)
Функция падает на коротких строках, например:
PHP:
truncate('мне кажется');
Но такие строки и не надо трогать! Для этого допишем в начало функции возврат исходной строки, если она меньше $chars:
PHP:
    public  function truncate($string, $chars = 50, $terminator = ' ...')
    {
        if (mb_strlen($string) < $chars) {
            return $string;
        }
        $cutPos = $chars - mb_strlen($terminator);
        $boundaryPos = mb_strrpos(mb_substr($string, 0, mb_strpos($string, ' ', $cutPos)), ' ');
        return mb_substr($string, 0, $boundaryPos === false ? $cutPos : $boundaryPos) . $terminator;
    }

Ну и некое подобие тестирования, близкого к мутационному или обезьяньему ;)
PHP:
var_dump(    truncate('мне кажется')    );

var_dump(    truncate(str_repeat('a', 50 - 1))    );
var_dump(    truncate(str_repeat('a', 50 - 3))    );
var_dump(    truncate(str_repeat('a', 50 - 4))    );
var_dump(    truncate(str_repeat('a', 50 - 5))    );
var_dump(    truncate(str_repeat('a', 50))    );
var_dump(    truncate(str_repeat('a', 50 + 1))    );

var_dump(    truncate(str_repeat('a ', 50 - 1))    );
var_dump(    truncate(str_repeat('a ', 50 - 3))    );
var_dump(    truncate(str_repeat('a ', 50 - 4))    );
var_dump(    truncate(str_repeat('a ', 50 - 5))    );
var_dump(    truncate(str_repeat('a ', 50))    );
var_dump(    truncate(str_repeat('a ', 50 + 1))    );
 
  • Нравится
Реакции: Sahh
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху