在html中从twitter渲染Twitter表情符号的最佳方法?

时间:2014-09-06 00:14:18

标签: php regex json twitter unicode

所以我从twitter api的查询中得到了json对象。在它的原始形式中,文本是这样的:

"check out this emoji \ud83d\udc98"

我花了很多时间阅读有关unicode及其格式的内容,并且我管理了一个将json unicode作为这样的键的库:

$emoji_dictionary = array(
  '\ud83d\udd39'=> array(
    'emoji-id'=> 'e-B76', 
    'codepoint'=> 'U+1F539', 
    'name'=> 'SMALL BLUE DIAMOND', 
    'twitter-id'=> '1f539'
  ), 
  '\ud83d\ude3f'=> array(
    'emoji-id'=> 'e-34D', 
    'codepoint'=> 'U+1F63F', 
    'name'=> 'CRYING CAT FACE', 
    'twitter-id'=> '1f63f'
  ), 

  ...
);

所以现在我一直在努力评估我从twitter获得的json unicode作为一个字符串,然后我可以投入到这个函数中:

function get_src($str) {
    echo 'regex found:' . $str . '<br />';
    return '<img class="twitter-emoji" src="https://abs.twimg.com/emoji/v1/72x72/' . $emoji_dictionary[$str]['twitter-id'] . '.png"/>';
  }

从表情符号的Twitter返回图像,但我似乎无法在PHP中正确preg_replace json数据。我有时会收到此错误:

preg_replace(): Compilation failed: PCRE does not support \L, \l, \N{name}, \U, or \u

我的preg_replace是这样的(请注意,这不起作用):

  $text = strval(json_encode($twitter_datum->text));
  $pattern = "/\\\\u([a-f0-9]{4})/e";
  $text = preg_replace($pattern, "get_src($1)", $text;

这种模式抓住了'd83d&#39;和&#39; dc98&#39;分开。

我试图做的不可能吗?我只想从1f498

获取"check out this emoji!! \ud83d\udc98"(来自词典)

1 个答案:

答案 0 :(得分:3)

对于任何想要做这样事情的人来说,这就是我所学到的:

json_encodeed内容的字符串操作是一个坏主意。我这样做是因为我无法看到unicode表达式,但是很少有盒子代替&amp;因此,并不知道如何评估它们。

Emoji for PHP对于这类事情来说是一个很好的资源。它可以用<span class="xxx'></span>替换任何unicode表情符号,其中xxx映射到该表情符号的精灵。它做了类似于我试图做的事情,但有两个主要区别:

  • 代码的正则表达式位于json_decoded实体
  • 不是将<img>替换成src转到twitter,而是转到<span>并引用本地png

我的代码现在看起来像这样,它工作正常。唯一的问题是,如果/当添加新的表情符号时,此脚本将无法识别它们。也许在那时,emojis会更加普遍,有完整的浏览器支持等等。这就是我所拥有的: $ JSON

function twitter_chron() {
  $json = get_tweets(50);
  $twitter_data = json_decode($json); 
  include(ABSPATH . 'wp-content/themes/custom/emoji/emoji.php');

    foreach($twitter_data as $twitter_datum) {
        $id = $twitter_datum->id;
        if (property_exists($twitter_datum, 'retweeted_status')) {
          $text = 'RT: ' . $twitter_datum->retweeted_status->text;
        } else {
          $text = $twitter_datum->text;
        }
        $text = emoji_unified_to_html($text);
        $text = iconv("UTF-8", "ASCII//IGNORE", $text);
        insert_tweet($id, $text, $date);
    } 
}

emoji_unified_to_html($text)来自emoji.php。我有另外的功能,我针对链接,主题标签&amp;提及,但我认为这与表情符号这一特定问题无关。

希望这有助于某人。