2014-09-06 2 views
0

J'ai donc l'objet json d'une requête de l'API de Twitter. Dans sa forme brute, le texte est comme ceci:La meilleure façon de rendre Twitter emojis de twitter en html?

"check out this emoji \ud83d\udc98"

J'ai passé beaucoup de temps à lire sur unicode et il est des formats, et je l'ai réussi une bibliothèque qui a le unicode JSON comme les clés comme ceci:

$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' 
), 

    ... 
); 

alors maintenant, je l'ai essayé comme l'enfer pour évaluer l'unicode JSON que je suis arrivé de Twitter comme une chaîne, que je peux ensuite jeter à cette fonction:

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"/>'; 
    } 

Qui renvoie une image de twitter de cet emoji, mais je ne peux pas sembler à preg_replace les données json correctement en PHP. Je reçois cette erreur parfois:

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

Mon preg_replace est comme ça (notez que cela ne fonctionne pas):

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

Ce modèle de la d83d 'attrape et 'dc98' séparément.

Est-ce que ce que j'essaie de faire est impossible? Je veux juste obtenir 1f498 (du dictionnaire) de "check out this emoji!! \ud83d\udc98"

Répondre

3

Pour tous ceux qui essaient de faire quelque chose comme cela, voici ce que j'ai appris:

opérations de chaîne sur quelque chose json_encodeed est une mauvaise idée. Je faisais cela parce que je ne pouvais pas voir l'expression unicode mais de petites cases à la place et je ne savais pas comment les évaluer.

Emoji for PHP est une grande ressource pour ce genre de chose. Il peut échanger n'importe quelle occurrence d'emoji unicode avec <span class="xxx'></span>, où xxx correspond à un sprite de cet emoji. Il fait quelque chose de semblable à ce que je voulais faire, mais pour deux différences principales:

  • Le regex de code est l'entité json_decoded
  • Plutôt que de le remplacer par un <img> avec un src va twitter, ce va à <span> avec référence à un png local

Mon code ressemble maintenant à ceci, et il fonctionne bien. Le seul problème est si/quand de nouveaux emojis sont ajoutés, ils ne seront pas reconnus par ce script. Peut-être à ce moment emojis sera un peu plus universel, w/soutien du navigateur, etc. Voici ce que j'ai: $ 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); 
    } 
} 

Le emoji_unified_to_html($text) est de la emoji.php. J'ai des fonctions supplémentaires que je cours contre le corps du tweet pour les liens, hashtags & mentions mais je me dis que ce n'est pas pertinent pour ce problème particulier d'emojis.

Espérons que cela aide quelqu'un.

Questions connexes