p3k / emoji-detector
检测并返回字符串中找到的所有表情符号
Requires
- php: >=7.4
- ext-intl: *
- ext-mbstring: *
Requires (Dev)
- phpunit/phpunit: ^8.5
README
此库将找到输入字符串中的所有表情符号,并返回每个表情符号字符的信息。它支持带有肤色修饰符的表情符号,以及由多人组成的复合表情符号。
当前版本支持Emoji版本15.1(2023年9月)
您可以在以下位置查看表情符号数据的目录
- https://unicode.org/Public/emoji/15.1/emoji-test.txt
- http://projects.iamcal.com/emoji-data/table.htm
安装
composer require p3k/emoji-detector
或者在您的项目中包含 src/Emoji.php
,并确保 map.json
和 regexp.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许可证下。