在 API 响应中将 URL 分组为单个对象输出

Group URLs into single object output in API response

所以我会尽可能地解释这一点,但我对如何呈现 link 有一些问题,所以我将在下面详细介绍。

这里是完整的方法:

public function link_urls($text)
{
    if (!$urls = $this->get('entities', 'urls')) {
        return $text;
    }
    foreach ($urls as $url) {
        $text = str_replace(
            $url->url,
            '<a href="' . $url->url . '" target="_blank">' . $url->display_url . '</a>',
            $text
        );
    }

    return $text;
}

此方法的作用是从 API 获取 ['text'] 参数响应,然后搜索 URL 并附加 HTML 输出。


假设我们有 $text 输出以下推文数据:

string(316) “As we continue to celebrate #BlackHistoryMonth , our next Black Artist Spotlight  is local painter @EbonyLewisArt https:// t.co/LaRa7GDk4i”

这条特定的推文有 4 张图片,但 Twitter 将它们全部分组为一个“推文”link,如上所示。


接下来,我正在检查它 returns 的推文 $urls 对象,它是 $urls = $this->get('entities', 'urls') 这给了我:

object(stdClass)#1958 (5) {
  ["start"]=>
  int(115)
  ["end"]=>
  int(138)
  ["url"]=>
  string(23) "https:// t.co/LaRa7GDk4i"
  ["expanded_url"]=>
  string(65) "https://twitter.com/dallasmavs/status/1491079415375495168/photo/1"
  ["display_url"]=>
  string(26) "pic.twitter.com/LaRa7GDk4i"
}
object(stdClass)#1737 (5) {
  ["start"]=>
  int(115)
  ["end"]=>
  int(138)
  ["url"]=>
  string(23) "https:// t.co/LaRa7GDk4i"
  ["expanded_url"]=>
  string(65) "https://twitter.com/dallasmavs/status/1491079415375495168/photo/1"
  ["display_url"]=>
  string(26) "pic.twitter.com/LaRa7GDk4i"
}
object(stdClass)#1735 (5) {
  ["start"]=>
  int(115)
  ["end"]=>
  int(138)
  ["url"]=>
  string(23) "https:// t.co/LaRa7GDk4i"
  ["expanded_url"]=>
  string(65) "https://twitter.com/dallasmavs/status/1491079415375495168/photo/1"
  ["display_url"]=>
  string(26) "pic.twitter.com/LaRa7GDk4i"
}
object(stdClass)#1736 (5) {
  ["start"]=>
  int(115)
  ["end"]=>
  int(138)
  ["url"]=>
  string(23) "https:// t.co/LaRa7GDk4i"
  ["expanded_url"]=>
  string(65) "https://twitter.com/dallasmavs/status/1491079415375495168/photo/1"
  ["display_url"]=>
  string(26) "pic.twitter.com/LaRa7GDk4i"
}

问题来了:

我正在调用一个 foreach 循环,该循环获取所有 URL 并使用 <a> 标记转换 $url->url 并显示 $url->display_url,如下所示:

foreach ($urls as $url) {
    $text = str_replace(
        $url->url,
        '<a href="' . $url->url . '" target="_blank">' . $url->display_url . '</a>',
        $text
    );
}

问题是 $text 只有一个 URL 要查看并且 foreach 循环 4 次导致问题并输出以下内容:

As we continue to celebrate #BlackHistoryMonth , our next Black Artist Spotlight is local painter @EbonyLewisArt pic.twitter.com/LaRa7GDk4i” target=”_blank”>pic.twitter.com/LaRa7GDk4i” target=”_blank”>pic.twitter.com/LaRa7GDk4i” target=”_blank”>pic.twitter.com/LaRa7GDk4i

当我在 $text 中有一个 $urls 对象和一个 link 时,它完全没问题,当 Twitter 将 link 分组在 [=16] 中时,问题就出现了=] 并输出多个对象。


这是我的问题:

  1. 如果有多个完全相同的对象,是否可以删除其他对象只输出一个?

  2. 在 foreach 中,如果对象相同,我可以以某种方式跳过所有对象吗?

感谢所有帮助!

请将您的 foreach 循环更改为此

foreach ($urls as $url) {
    if( strpos($text, $url->url) !== false ){
        $text = str_replace(
            $url->url,
            '<a href="' . str_replace(' ', '', $url->url) . '" target="_blank">' . $url->display_url . '</a>',
            $text
        );
        break;
    }
}