PHP Foreach循环打印所有表情符号

时间:2017-10-13 22:12:43

标签: php arrays loops unicode emoji

我发现在PHP 7中有更好的Emojis支持,但没有可供参考的emojis打包集/库。截至目前,我必须在https://apps.timwhitlock.info/emoji/tables/unicode搜索并查找我想要的表情符号的UNICODE。

通过迭代循环而不是引用我自己必须构建的数组(复制和粘贴每个UNICODE),是否有更简单的方法来获取每个(最新的)表情符号?

4 个答案:

答案 0 :(得分:1)

您可以定义范围并使用循环迭代它们并打印它们,而不是手动列出所有unicodes。

这可能是这样的:

$emojiUnicodeRange = [
[0x1f600, 0x1f64e],
[0x1f910, 0x1f91e],
[0x1f920, 0x1f927],
[0x1f300, 0x1f5ff],
[0x1f680, 0x1f6c1],
[0x1f950, 0x1f95e],
[0x1f980, 0x1f991]
];
foreach($emojiUnicodeRange as $range)
    for($emojiUnicode=$range[0];$emojiUnicode<=$range[1];$emojiUnicode++)
        echo html_entity_decode('&#'.$emojiUnicode.';', 0, 'UTF-8');

html_entity_decode('&#'.$emojiUnicode.';', 0, 'UTF-8')部分将十六进制数转换为实体并将其解码为utf-8。可悲的是,据我所知,没有更简单的方法来实现这一点。

答案 1 :(得分:1)

尝试以下方法:

<?php

$data = file_get_contents("https://apps.timwhitlock.info/emoji/tables/unicode");

$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($data);
libxml_clear_errors();
$finder = new DomXPath($doc);
$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' code ')]");
$unicodes = [];
$i = 1;
foreach ($nodes as $node) 
{
if($i % 2 === 0) {$i++;continue;}

    $unicode = trim($node->textContent);
    $unicodes[] = $unicode;
    file_put_contents("unicodes.txt", $unicode. "\r\n", FILE_APPEND);

    $i++;
}

var_dump($unicodes);

它将从网站获取所有Unicodes并将其存储在文件unicodes.txt和数组$unicodes中。这只是使用DOMDocument来废弃页面。然后你可以使用以下方法获得所有这些:

<?php

$emojis = file("unicodes.txt");

foreach($emojis as $emoji)
{
    $emoji = trim($emoji);
    $emoji = hexdec($emoji);
    echo "&#$emoji;";
}

答案 2 :(得分:1)

嗨,这是基于凯尔的更新答案

$emojis = [];

$reg = "/^(?<start>[A-F0-9 ]+)(?:[\.]{2})?((?<end>[A-F0-9 ]+))?.*;/m";
$data = file_get_contents('https://unicode.org/Public/emoji/14.0/emoji-sequences.txt');

$matches = [];
preg_match_all($reg, $data, $matches);

$start = str_replace(' ', '', $matches['start']);
$end = str_replace(' ', '', $matches['end']);

for ($i = 0; $i < count($start); $i++) {
    $emojis[] = $start[$i];
    if (!empty($end[$i])) {
        for ($j = hexdec($start[$i]) + 0x1; $j <= hexdec($end[$i]); $j += 0x1) {
            $emojis[] = dechex($j);
        }
    }
}

答案 3 :(得分:0)

您可以查看http://unicode.org/Public/emoji/6.0/emoji-data.txt中所有最新表情符号的列表,但似乎主要支持的版本是v5,可在此处查看http://unicode.org/Public/emoji/5.0/emoji-data.txt

您需要使用正则表达式解析结果以获取范围,然后您可以迭代preg_match的结果,如果该范围有一个结束编号,您希望获得十六进制范围之间的所有值。如果您不得不经常进行此操作,则可能需要缓存这些结果。

$emojis = [];

$reg = "/^(?<start>[a-fA-F0-9]+)([\.]{2})?((?<end>[a-fA-F0-9]+))?\s+;/m";
$data = file_get_contents('http://unicode.org/Public/emoji/5.0/emoji-data.txt');

$matches = [];
preg_match_all($reg, $data, $matches);

$start = $matches['start'];
$end = $matches['end'];

for ($i = 0; $i < count($start); $i++) {
    $emojis[] = $start[$i];
    if (!empty($end[$i])) {
        for ($j = $start[$i] + 0x1; $j <= $end[$i]; $j += 0x1) {
            $emojis[] = is_int($j) ? dechex($j) : $j;
        }
    }
}

// $emojis contains valid emojis from the file

你会想要测试一下,我只是快速地把它放在一起。