2017-10-13 48 views
3

我看到有更好的支持表情符号在PHP 7,但表情符号,从引用的无包装组/库。截至目前,我必须搜索并寻找我想要的表情符号的UNICODE,地址为https://apps.timwhitlock.info/emoji/tables/unicodePHP foreach循环打印所有表情符号

会不会有通过一个迭代循环,而不是引用数组我必须建立在我自己获得的每一个(最新)表情更简单的方法(复制粘贴&每UNICODE)?

+0

你可以用php或用户脚本解析上面的页面。应该没有问题,应该在10分钟内完成。 –

+0

你想保留每个表情符号的描述,或者只是了解所有可用的表情符号? – kyle

+0

也是你想保持他们分类?因为它们全都落在十六进制范围内,所以如果你确定了范围,你可以在开始范围和结束范围之间增加,从而产生emojis列表 – kyle

回答

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;"; 
} 
+0

非常有趣的解决方案!我喜欢它如何从该网站获取到.txt文件(但是有几个Unicodes在新行上不分开 - 我必须手动修复它)。这似乎到目前为止,不过,我很好奇这个系列中是否缺少表情符号。 – theflarenet

1

代替手工列出所有统一码的,你可以定义范围和使用循环遍历它们,并打印出来。

这可能是这样的:

$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解码。据我所知,可悲的是没有更简单的方法来实现这一点。

+0

有趣的,但范围1f300到1f5ff范围内的一些Emojis不被识别。另外为什么限制为UTF-8,如果你不介意我问的话?尽管如此,答案很好。 – theflarenet

+0

@theflarenet大多数页面都是utf-8。从来没有看到一个字符集utf-16或类似的东西。它将emojis的utf-16be表示转换为UTF-8。如果你想使用不同的编码,可以随意使用它:) ||你确定表情符号丢失了吗?使用不同的浏览器进行检查?从我的观点来看,为什么它应该适用于所有表情符号,除了这个范围内的少数表情符号以外,没有任何意义。代码是一样的,想法是一样的。所以我不确定在哪里可以找到问题的解决方案。你可以给我一个例子吗? –

+0

对不起,迟到的回应。这是一个截图:https:// imgur。com/a/qVaWd – theflarenet

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 

你会想测试这个,我只是把它放在一起真正快。