我想拆分包含表情符号的字符串。我不明白为什么我的函数会生成一个空字符。
代码:
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] =>
)希望天气晴朗。任何帮助都是非常感谢的!
发布于 2020-03-02 03:02:13
尝试添加array_filter以删除空值:
return array_filter(preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY));发布于 2020-03-02 04:20:01
该字符串有4个字符。第三个是:
echo bin2hex(mb_substr("⬜️", 2, 1, "UTF-8"));输出:
efb88f
它对应于字符U+FE0F
此代码点可能会更改前面字符的外观。如果这是一个符号、丁巴特或表情符号,U+FE0F会强制它呈现为彩色图像,而不是单色文本变体。
发布于 2020-03-02 04:49:09
我试着根据@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);https://stackoverflow.com/questions/60478638
复制相似问题