Получить титул веб-сайта по ссылке

Обратите внимание на источники новостей 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; } 

он извлекает содержимое веб-страницы и пытается получить кодировку кодировки документов с помощью ((от наивысшего приоритета до самого низкого):

  1. Параметр «charset» HTTP в поле «Content-Type».
  2. Объявление META с параметром «http-equiv» для «Content-Type» и значением, установленным для «charset».
  3. Атрибут charset устанавливается на элемент, который обозначает внешний ресурс.

(см. 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 – Войдите, зарегистрируйтесь или узнайте больше