andrewdavid/emoji-detector

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

1.0.0 2023-05-25 23:00 UTC

This package is auto-updated.

Last update: 2024-09-26 03:12:08 UTC


README

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

安装

composer require andrewdavid/emoji-detector

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

用法

检测表情符号

$input = "Hello 👍🏼 World 👨‍👩‍👦‍👦";
$emoji = (new Emoji\EmojiDetector())->detectEmoji($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 - 表情符号在字符串中的位置,将每个表情符号计为一个字符,与 grapheme_* 函数一起使用

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

$string = "Trešnja 🍒";
$emoji = (new Emoji\EmojiDetector())->detectEmoji($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 = (new Emoji\EmojiDetector())->replaceEmoji('I like 🌮 and 🌯', ':', ':');
echo $string;
// I like :taco: and :burrito:

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

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

$emoji = (new Emoji\EmojiDetector())->isSingleEmoji('👨‍👩‍👦‍👦');
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 = (new Emoji\EmojiDetector())->isSingleEmoji('😻🐈');
// false

许可证

版权所有 2017-2022 年由 Aaron Parecki。

在 MIT 许可证下可用。

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

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