拆分表情符号字符串



我想拆分一个包含表情符号的字符串。我不明白为什么我的函数会生成一个空字符。

代码:

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] => 🚧
)

希望一切都清楚。非常感谢您的帮助!

尝试添加array_filter以删除空值:

return array_filter(preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY));

字符串有4个字符。第三个是:

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

输出:

efb88f

对应字符U+FE0F:

此代码点可能会更改前一个字符的外观。如果这是一个符号、丁蝙蝠或表情符号,U+FE0F将强制渲染作为与单色文本变体相比的彩色图像。

我试图找到一种方法,根据@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);

最新更新