p3k/emoji-detector

检测并返回字符串中找到的所有表情符号

1.2.0 2024-02-19 18:29 UTC

This package is auto-updated.

Last update: 2024-09-19 19:37:57 UTC


README

此库将找到输入字符串中的所有表情符号,并返回每个表情符号字符的信息。它支持带有肤色修饰符的表情符号,以及由多人组成的复合表情符号。

当前版本支持Emoji版本15.1(2023年9月)

您可以在以下位置查看表情符号数据的目录

安装

composer require p3k/emoji-detector

或者在您的项目中包含 src/Emoji.php,并确保 map.jsonregexp.json 文件与 Emoji.php 位于同一文件夹中。您不需要其他任何文件来在自己的项目中使用。

使用方法

检测表情符号

$input = "Hello 👍🏼 World 👨‍👩‍👦‍👦";
$emoji = Emoji\detect_emoji($input);

print_r($emoji);

该函数返回一个数组,其中包含字符串中找到的每个表情符号的详细信息。

Array
(
    [0] => Array
        (
            [emoji] => 👍🏼
            [short_name] => +1
            [num_points] => 2
            [points_hex] => Array
                (
                    [0] => 1F44D
                    [1] => 1F3FC
                )
            [hex_str] => 1F44D-1F3FC
            [skin_tone] => skin-tone-3
            [byte_offset] => 6
            [grapheme_offset] => 6
        )
    [1] => Array
        (
            [emoji] => 👨‍👩‍👦‍👦
            [short_name] => man-woman-boy-boy
            [num_points] => 7
            [points_hex] => Array
                (
                    [0] => 1F468
                    [1] => 200D
                    [2] => 1F469
                    [3] => 200D
                    [4] => 1F466
                    [5] => 200D
                    [6] => 1F466
                )
            [hex_str] => 1F468-200D-1F469-200D-1F466-200D-1F466
            [skin_tone] =>
            [byte_offset] => 21
            [grapheme_offset] => 14
        )
)
  • emoji - 找到的表情符号序列,作为原始字节序列。您可以将此输出以显示原始表情符号。
  • short_name - 表情符号的简称,由 Slack 的表情符号数据 定义。
  • num_points - 此表情符号由多少个 Unicode 代码点组成。
  • points_hex - 组成此表情符号的每个 Unicode 代码点的数组。这些以十六进制字符串的形式返回。这还将包括“不可见”字符,如 ZWJ 字符和肤色修饰符。
  • hex_str - 以十六进制形式分开的所有 Unicode 代码点的列表。此字符串存在于 Slack 表情符号数据 数组中。
  • skin_tone - 如果在表情符号中使用了肤色修饰符,则此字段指示哪种肤色,因为 short_name 将不包含肤色。
  • byte_offset - 表情符号在字符串中的字节位置,用于与纯 str* 函数一起使用
  • grapheme_offset - 表情符号在字符串中的位置,每个表情符号计为1个字符,用于与 grapheme_* 函数一起使用

您可以使用 grapheme_* 函数使用 grapheme_offset 位置返回来提取字符串的某些部分。例如

$string = "Trešnja 🍒";
$emoji = Emoji\detect_emoji($string);
echo '.'.grapheme_substr($string, 0, $emoji[0]['grapheme_offset']).".\n";
echo '.'.substr($string, 0, $emoji[0]['byte_offset']).".\n";
// Both output ".Trešnja ."

用字符串表示替换表情符号

$string = Emoji\replace_emoji('I like 🌮 and 🌯', ':', ':');
echo $string;
// I like :taco: and :burrito:

测试字符串是否为单个表情符号

由于仅通过计算字符串中的 Unicode 字符数量并不能告诉你字符串中有多少可见的表情符号,因此确定单个字符是否为表情符号更为复杂。此函数仅在字符串包含单个表情符号字符时返回表情符号数据,否则返回 false。

$emoji = Emoji\is_single_emoji('👨‍👩‍👦‍👦');
print_r($emoji);
Array
(
    [emoji] => 👨‍👩‍👦‍👦
    [short_name] => man-woman-boy-boy
    [num_points] => 7
    [points_hex] => Array
        (
            [0] => 1F468
            [1] => 200D
            [2] => 1F469
            [3] => 200D
            [4] => 1F466
            [5] => 200D
            [6] => 1F466
        )

    [hex_str] => 1F468-200D-1F469-200D-1F466-200D-1F466
    [skin_tone] =>
    [byte_offset] => 0
    [grapheme_offset] => 0
)
$emoji = Emoji\is_single_emoji('😻🐈');
// false

从字符串中删除表情符号

您可以使用此函数从字符串中删除所有表情符号,可选地删除尾随空格。

$string = "I like 🌮 and 🌯";
echo Emoji\remove_emoji($string);
// "I like  and "
echo Emoji\remove_emoji($string, ['collapse' => true]);
// "I like and";

更新

当发布新的表情符号集时,此库需要更新为新的 Unicode 点和名称。表情符号数据的来源是 iamcal/emoji-data,因此首先检查那里是否有最新更新。您可以使用以下命令构建此库使用的源文件

composer build

测试

提供了一套全面的测试以确保一切按预期工作,包括对新版本中添加的新表情符号进行的测试。您可以使用以下命令运行测试:

composer test

许可证

由Aaron Parecki用❤️制作。

版权所有 2017-2024 Aaron Parecki。在MIT许可证下提供。

表情符号数据来源于iamcal/emoji-data,MIT许可证下。

表情符号解析正则表达式来源于EmojiOne,MIT许可证下。