tioffs
@tioffs

PHP не правильно возвращает подстроку, как считать спец символы и смайлы?

Если в тексте есть emoji и спец символы php начинает не правильно считать strlen() и от этого substr неправильно выбирает значение.

JavaScript
'⚡️ локальные группы, ⚡️Больше возможностей• Теперь Вы  ⚡️'.substr(3,9)
#Выведет локальные


PHP
$text = '⚡️ локальные группы, ⚡️Больше возможностей• Теперь Вы  ⚡️ ';
echo grapheme_substr($text, 3, 9);
#Выведет: окальные
echo mb_substr($text, 3, 9);
#Выведет: окальные
  • Вопрос задан
  • 318 просмотров
Решения вопроса 1
tioffs
@tioffs Автор вопроса
Решение данного вопроса:
function mb_strlen($text)
    {
        $length = 0;
        $textlength = strlen($text);
        for ($x = 0; $x < $textlength; $x++) {
            $char = ord($text[$x]);
            if (($char & 0xC0) != 0x80) {
                $length += 1 + ($char >= 0xf0);
            }
        }

        return $length;
    }

function mb_substr($text, $offset, $length = null)
    {
        $mb_text_length = mb_strlen($text);
        if ($offset < 0) {
            $offset = $mb_text_length + $offset;
        }
        if ($length < 0) {
            $length = ($mb_text_length - $offset) + $length;
        } elseif ($length === null) {
            $length = $mb_text_length - $offset;
        }
        $new_text = '';
        $current_offset = 0;
        $current_length = 0;
        $text_length = strlen($text);
        for ($x = 0; $x < $text_length; $x++) {
            $char = ord($text[$x]);
            if (($char & 0xC0) != 0x80) {
                $current_offset += 1 + ($char >= 0xf0);
                if ($current_offset > $offset) {
                    $current_length += 1 + ($char >= 0xf0);
                }
            }
            if ($current_offset > $offset) {
                if ($current_length <= $length) {
                    $new_text .= $text[$x];
                }
            }
        }

        return $new_text;
    }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
irishmann
@irishmann
Научись пользоваться дебаггером
strlen возвращает не колличество символов, а колличество байт, мы же все знаем чтоб документацию не читать.
Emoji - это юникод, поэтому используйте функции для многобайтовых кодировок
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы