0

Facebook api からこの投稿オブジェクトを取得しています:

 {
"id"=>"XXX", 
..., 
"message"=>"abcd efg hijkl mn The New York Times opqr", 
"message_tags"=>{
    "18"=>[{
        "id"=>"5281959998", 
        "name"=>"The New York Times", 
        "type"=>"page", 
        "offset"=>18, 
        "length"=>18
        }]
   },
...
} 

オフセットと長さの属性を使用するように、レールでFacebookページへのリンクを作成するにはどうすればよいですか? 結果は次のようになります。

abcd efg hijkl mn <a href="www.facebook.com/5281959998">The New York Times</a> opqr
4

1 に答える 1

0

私は今これをしなければなりませんでしたが、PHPで. これが私の解決策でした:

/**
 * Get message HTML
 *
 * @param string $text The message text
 * @param array $tags The tags array
 * @return string HTML message string with linked tags
 */
public static function getMessageHtml($text, $tags) {
    $doc = new DOMDocument;
    $doc->appendChild($doc->createTextNode($text));
    if (is_array($tags)) {
        foreach ($tags as $tag) {
            $tag = $tag[0];
            $start = 0;
            foreach ($doc->childNodes as $child) {
                if ($tag['offset'] < $start + strlen($child->nodeValue)) {
                    $meat = $child->splitText($tag['offset'] - $start);
                    $tail = $meat->splitText($tag['length']);
                    $a = $doc->createElement('a');
                    $a->setAttribute('href', '//facebook.com/' . $tag['id']);
                    $a->setAttribute('title', $tag['name']);
                    $meat->parentNode->replaceChild($a, $meat);
                    $a->appendChild($meat);
                    break;
                }
                $start += strlen($child->nodeValue);
            }
        }
    }
    return trim($doc->saveHTML());
}

これは、これまでのすべてのテスト ケースで機能しましたが、タグが重複したりネストされたりすると危険な場合があります。Facebook がそのようなタグを返すかどうかはわかりません。

これを Ruby に簡単に移植できることを願っています。

于 2014-03-21T00:45:26.667 に答える