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
        }]
   },
...
} 

如何在 rails 中创建指向 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 回答