Обратите внимание на источники новостей Google в нижней части каждого отрывка из статьи.
The Guardian – Новости ABC – Рейтер – Bloomberg
Я пытаюсь подражать этому.
Например, после отправки URL-адреса http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/
Я хочу вернуть The Washington Times
Как это возможно с php?
Мой ответ расширяется на ответе @AI W на использование заголовка страницы. Ниже приведен код, чтобы выполнить то, что он сказал.
<?php function get_title($url){ $str = file_get_contents($url); if(strlen($str)>0){ $str = trim(preg_replace('/\s+/', ' ', $str)); // supports line breaks inside <title> preg_match("/\<title\>(.*)\<\/title\>/i",$str,$title); // ignore case return $title[1]; } } //Example: echo get_title("http://www.washingtontimes.com/"); ?>
ВЫВОД
Washington Times – Политика, ломающие новости, США и мировые новости
Как вы можете видеть, это не совсем то, что Google использует, поэтому это заставляет меня поверить, что они получают имя хоста URL и сопоставляют его со своим списком.
http://www.washingtontimes.com/ => The Washington Times
$doc = new DOMDocument(); @$doc->loadHTMLFile('http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/'); $xpath = new DOMXPath($doc); echo $xpath->query('//title')->item(0)->nodeValue."\n";
Вывод:
Комиссионная задолженность падает на тестовое голосование – Washington Times
Очевидно, что вы также должны выполнять базовую обработку ошибок.
Вы можете получить содержимое URL-адреса и выполнить поиск регулярного выражения для содержимого элемента title
.
<?php $urlContents = file_get_contents("http://example.com/"); preg_match("/<title>(.*)<\/title>/i", $urlContents, $matches); print($matches[1] . "\n"); // "Example Web Page" ?>
Или, если вы не хотите использовать регулярное выражение (чтобы соответствовать чему-то очень близко к началу документа), вы можете использовать объект DOMDocument :
<?php $urlContents = file_get_contents("http://example.com/"); $dom = new DOMDocument(); @$dom->loadHTML($urlContents); $title = $dom->getElementsByTagName('title'); print($title->item(0)->nodeValue . "\n"); // "Example Web Page" ?>
Я оставляю это для вас, чтобы решить, какой метод вам больше нравится.
Используя get_meta_tags () с домашней страницы домена, NYT возвращает что-то, что может потребовать усечения, но может быть полезно.
$b = "http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/" ; $url = parse_url( $b ) ; $tags = get_meta_tags( $url['scheme'].'://'.$url['host'] ); var_dump( $tags );
включает описание «The Washington Times» публикует последние новости и комментарии по вопросам, которые влияют на будущее нашей нации ».
Руководство PHP по cURL
<?php $ch = curl_init("http://www.example.com/"); $fp = fopen("example_homepage.txt", "w"); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec($ch); curl_close($ch); fclose($fp); ?>
Руководство PHP по регулярному выражению Perl
<?php $subject = "abcdef"; $pattern = '/^def/'; preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3); print_r($matches); ?>
И поставив их вместе:
<?php // create curl resource $ch = curl_init(); // set url curl_setopt($ch, CURLOPT_URL, "example.com"); //return the transfer as a string curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // $output contains the output string $output = curl_exec($ch); $pattern = '/[<]title[>]([^<]*)[<][\/]titl/i'; preg_match($pattern, $output, $matches); print_r($matches); // close curl resource to free up system resources curl_close($ch); ?>
Я не могу обещать, что этот пример будет работать, так как у меня здесь нет PHP, но он должен помочь вам приступить к работе.
Если вы хотите использовать сторонний сервис для этого, я просто построил его на http://www.runway7.net/radar
Дает вам название, описание и многое другое. Например, попробуйте свой пример на Radar . ( http://radar.runway7.net/?url=http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/ )
В качестве альтернативы вы можете использовать Simple Html Dom Parser :
<?php require_once('simple_html_dom.php'); $html = file_get_html('http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/'); echo $html->find('title', 0)->innertext . "<br>\n"; echo $html->find('div[class=entry-content]', 0)->innertext;
Я написал функцию для ее обработки:
function getURLTitle($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $content = curl_exec($ch); $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); $charset = ''; if($contentType && preg_match('/\bcharset=(.+)\b/i', $contentType, $matches)){ $charset = $matches[1]; } curl_close($ch); if(strlen($content) > 0 && preg_match('/\<title\b.*\>(.*)\<\/title\>/i', $content, $matches)){ $title = $matches[1]; if(!$charset && preg_match_all('/\<meta\b.*\>/i', $content, $matches)){ //order: //http header content-type //meta http-equiv content-type //meta charset foreach($matches as $match){ $match = strtolower($match); if(strpos($match, 'content-type') && preg_match('/\bcharset=(.+)\b/', $match, $ms)){ $charset = $ms[1]; break; } } if(!$charset){ //meta charset=utf-8 //meta charset='utf-8' foreach($matches as $match){ $match = strtolower($match); if(preg_match('/\bcharset=([\'"])?(.+)\1?/', $match, $ms)){ $charset = $ms[1]; break; } } } } return $charset ? iconv($charset, 'utf-8', $title) : $title; } return $url; }
он извлекает содержимое веб-страницы и пытается получить кодировку кодировки документов с помощью ((от наивысшего приоритета до самого низкого):
(см. http://www.w3.org/TR/html4/charset.html )
а затем использует iconv
для преобразования названия в кодировку utf-8
.
Получите титул веб-сайта по ссылке и конвертируйте заголовок в кодировку символов utf-8:
https://gist.github.com/kisexu/b64bc6ab787f302ae838
function getTitle($url) { // get html via url $ch = curl_init(); curl_setopt($ch, CURLOPT_AUTOREFERER, true); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $html = curl_exec($ch); curl_close($ch); // get title preg_match('/(?<=<title>).+(?=<\/title>)/iU', $html, $match); $title = empty($match[0]) ? 'Untitled' : $match[0]; $title = trim($title); // convert title to utf-8 character encoding if ($title != 'Untitled') { preg_match('/(?<=charset\=).+(?=\")/iU', $html, $match); if (!empty($match[0])) { $charset = str_replace('"', '', $match[0]); $charset = str_replace("'", '', $charset); $charset = strtolower( trim($charset) ); if ($charset != 'utf-8') { $title = iconv($charset, 'utf-8', $title); } } } return $title; }
Я стараюсь избегать регулярных выражений, когда это не является необходимым, я создал функцию, чтобы получить заголовок сайта с curl и DOMDocument ниже.
function website_title($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // some websites like Facebook need a user agent to be set. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36'); $html = curl_exec($ch); curl_close($ch); $dom = new DOMDocument; @$dom->loadHTML($html); $title = $dom->getElementsByTagName('title')->item('0')->nodeValue; return $title; } echo website_title('https://www.facebook.com/');
выше возвращает следующее: Добро пожаловать в Facebook – Войдите, зарегистрируйтесь или узнайте больше