Сплит эмодзи - PullRequest
       4

Сплит эмодзи

2 голосов
/ 01 марта 2020

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

Код:

function str_split_unicode($str, $l = 0) {
    if ($l > 0) {
      $ret = array();
      $len = mb_strlen($str, "UTF-8");
      for ($i = 0; $i < $len; $i += $l) {
        $ret[] = mb_substr($str, $i, $l, "UTF-8");
      }
      return $ret;
   }
   return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
}

$emoji_value = "?⬜️?";
$emoji_split = str_split_unicode($emoji_value,1);

print_r($emoji_split);

Результат:

Array
(
    [0] => ?
    [1] => ⬜
    [2] => ️
    [3] => ?
)

Надеюсь, все понятно. Любая помощь с благодарностью!

Ответы [ 3 ]

1 голос
/ 01 марта 2020

Строка имеет 4 символа. Третий:

echo bin2hex(mb_substr("?⬜️?", 2, 1, "UTF-8"));

Выход:

efb88f

Соответствует символу U + FE0F :

Эта кодовая точка может изменить внешний вид предыдущего символа. Если это символ, дингбат или эмодзи, U + FE0F заставляет его отображаться как красочное изображение по сравнению с моно chrome текстовым вариантом.

1 голос
/ 01 марта 2020

Попробуйте добавить array_filter, чтобы удалить нулевое значение:

return array_filter(preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY));
0 голосов
/ 01 марта 2020

Я попытался найти способ, как удалить этот лишний символ на основе ответа @Olivier без удачи. Я делюсь своим кодом, может быть, кому-то будет полезно найти решение:

<?php
function isStringHasEmojis($string) {
    $emojis_regex =
        '/[\x{0080}-\x{02AF}'
        .'\x{0300}-\x{03FF}'
        .'\x{0600}-\x{06FF}'
        .'\x{0C00}-\x{0C7F}'
        .'\x{1DC0}-\x{1DFF}'
        .'\x{1E00}-\x{1EFF}'
        .'\x{2000}-\x{209F}'
        .'\x{20D0}-\x{214F}'
        .'\x{2190}-\x{23FF}'
        .'\x{2460}-\x{25FF}'
        .'\x{2600}-\x{27EF}'
        .'\x{2900}-\x{29FF}'
        .'\x{2B00}-\x{2BFF}'
        .'\x{2C60}-\x{2C7F}'
        .'\x{2E00}-\x{2E7F}'
        .'\x{3000}-\x{303F}'
        .'\x{A490}-\x{A4CF}'
        .'\x{E000}-\x{F8FF}'
        .'\x{FE00}-\x{FE0F}'
        .'\x{FE30}-\x{FE4F}'
        .'\x{1F000}-\x{1F02F}'
        .'\x{1F0A0}-\x{1F0FF}'
        .'\x{1F100}-\x{1F64F}'
        .'\x{1F680}-\x{1F6FF}'
        .'\x{1F910}-\x{1F96B}'
        .'\x{1F980}-\x{1F9E0}]/u';
    preg_match($emojis_regex, $string, $matches);
    return !empty($matches);
}

function str_split_unicode($str, $l = 0) {
    if ($l > 0) {
        $res = [];      
        $len = mb_strlen($str, "UTF-8");                
        for ($i = 0; $i < $len; $i += $l) {
            $val = mb_substr($str, $i, $l, "UTF-8");
            if(isStringHasEmojis($val)) {
                $res[] = $val;
            }

        }
        return $res;
    }
}

$emoji_value = "?⬜️?";
$emoji_split = str_split_unicode($emoji_value,1);

echo "<pre>";
print_r($emoji_split);
...