Из-за нового API Twitter я использую PHP для отображения 1 последнего твита на моей веб-странице с использованием PHP.
На данный момент у меня это работает, так что твит просто выводится как простая текстовая строка. Мой вопрос: как я могу управлять выводимым HTML? Я хочу, чтобы иметь возможность отображать ссылки в качестве ссылок, если хэш-адрес или веб-адрес указаны в твите. Как мне это сделать?
Вот мой код до сих пор, который выводит строку в виде твита на моей странице:
function get_tweet() { require 'tmhOAuth.php'; require 'tmhUtilities.php'; $tmhOAuth = new tmhOAuth(array( 'consumer_key' => 'secret', 'consumer_secret' => 'secret', 'user_token' => 'secret', 'user_secret' => 'secret', 'curl_ssl_verifypeer' => false )); $code = $tmhOAuth->request('GET', $tmhOAuth->url('1.1/statuses/user_timeline'), array( 'screen_name' => 'evanrichards', 'count' => '1')); $response = $tmhOAuth->response['response']; $tweets = json_decode($response, true); echo($tweets[0]['text']); }
Вот пример кода для замены ссылок, hashtags и attags со ссылками в php
$tweet = "@george check out http://www.google.co.uk #google"; //Convert urls to <a> links $tweet = preg_replace("/([\w]+\:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/", "<a target=\"_blank\" href=\"$1\">$1</a>", $tweet); //Convert hashtags to twitter searches in <a> links $tweet = preg_replace("/#([A-Za-z0-9\/\.]*)/", "<a target=\"_new\" href=\"http://twitter.com/search?q=$1\">#$1</a>", $tweet); //Convert attags to twitter profiles in <a> links $tweet = preg_replace("/@([A-Za-z0-9\/\.]*)/", "<a href=\"http://www.twitter.com/$1\">@$1</a>", $tweet); echo $tweet;
Это дает результат
<a href="http://www.twitter.com/george">@george</a> check out <a target="_blank" href="http://www.google.co.uk">http://www.google.co.uk</a> <a target="_new" href="http://twitter.com/search?q=google">#google</a>
Таким образом, вы можете изменить свой код на
function get_tweet() { require 'tmhOAuth.php'; require 'tmhUtilities.php'; $tmhOAuth = new tmhOAuth(array( 'consumer_key' => 'secret', 'consumer_secret' => 'secret', 'user_token' => 'secret', 'user_secret' => 'secret', 'curl_ssl_verifypeer' => false )); $code = $tmhOAuth->request('GET', $tmhOAuth->url('1.1/statuses/user_timeline'), array( 'screen_name' => 'evanrichards', 'count' => '1')); $response = $tmhOAuth->response['response']; $tweets = json_decode($response, true); $tweet = $tweets[0]['text']; $tweet = preg_replace("/([\w]+\:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/", "<a target=\"_blank\" href=\"$1\">$1</a>", $tweet); $tweet = preg_replace("/#([A-Za-z0-9\/\.]*)/", "<a target=\"_new\" href=\"http://twitter.com/search?q=$1\">#$1</a>", $tweet); $tweet = preg_replace("/@([A-Za-z0-9\/\.]*)/", "<a href=\"http://www.twitter.com/$1\">@$1</a>", $tweet); echo($tweet); }
Я уверен, что регулярное выражение может быть улучшено.
Или еще лучше вы можете разделить его на свою собственную функцию.
function linkify_tweet($tweet) { $tweet = preg_replace("/([\w]+\:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/", "<a target=\"_blank\" href=\"$1\">$1</a>", $tweet); $tweet = preg_replace("/#([A-Za-z0-9\/\.]*)/", "<a target=\"_new\" href=\"http://twitter.com/search?q=$1\">#$1</a>", $tweet); $tweet = preg_replace("/@([A-Za-z0-9\/\.]*)/", "<a href=\"http://www.twitter.com/$1\">@$1</a>", $tweet); return $tweet; } function get_tweet() { require 'tmhOAuth.php'; require 'tmhUtilities.php'; $tmhOAuth = new tmhOAuth(array( 'consumer_key' => 'secret', 'consumer_secret' => 'secret', 'user_token' => 'secret', 'user_secret' => 'secret', 'curl_ssl_verifypeer' => false )); $code = $tmhOAuth->request('GET', $tmhOAuth->url('1.1/statuses/user_timeline'), array( 'screen_name' => 'evanrichards', 'count' => '1')); $response = $tmhOAuth->response['response']; $tweets = json_decode($response, true); echo(linkify_tweet($tweets[0]['text'])); }
Простое регулярное выражение будет работать в большинстве случаев. Но объекты Twitter решают проблему синтаксического анализа для вас, а также дают дополнительную информацию о ссылках, именах пользователей и т. Д.
См. Полную документацию здесь: https://dev.twitter.com/overview/api/entities-in-twitter-objects
Чтобы отформатировать текст, получите список всех необходимых вам заметок, затем замените их в обратном порядке (так что смещения остаются правильными после расширения текста).
<?php function twitter_format($tweet) { $text = $tweet['text']; $entities = isset($tweet['entities']) ? $tweet['entities'] : array(); $replacements = array(); if (isset($entities['hashtags'])) { foreach ($entities['hashtags'] as $hashtag) { list ($start, $end) = $hashtag['indices']; $replacements[$start] = array($start, $end, "<a href=\"https://twitter.com/search?q={$hashtag['text']}\">#{$hashtag['text']}</a>"); } } if (isset($entities['urls'])) { foreach ($entities['urls'] as $url) { list ($start, $end) = $url['indices']; // you can also use $url['expanded_url'] in place of $url['url'] $replacements[$start] = array($start, $end, "<a href=\"{$url['url']}\">{$url['display_url']}</a>"); } } if (isset($entities['user_mentions'])) { foreach ($entities['user_mentions'] as $mention) { list ($start, $end) = $mention['indices']; $replacements[$start] = array($start, $end, "<a href=\"https://twitter.com/{$mention['screen_name']}\">@{$mention['screen_name']}</a>"); } } if (isset($entities['media'])) { foreach ($entities['media'] as $media) { list ($start, $end) = $media['indices']; $replacements[$start] = array($start, $end, "<a href=\"{$media['url']}\">{$media['display_url']}</a>"); } } // sort in reverse order by start location krsort($replacements); foreach ($replacements as $replace_data) { list ($start, $end, $replace_text) = $replace_data; $text = mb_substr($text, 0, $start, 'UTF-8').$replace_text.mb_substr($text, $end, NULL, 'UTF-8'); } return "<p>$text</p>"; } echo twitter_format($tweets[0]);