Самый быстрый способ получить <title> в PHP

Я делаю систему закладок и ищу самый быстрый (самый простой) способ получить название страницы с PHP.

Было бы неплохо иметь что-то вроде $title = page_title($url)

Solutions Collecting From Web of "Самый быстрый способ получить <title> в PHP"

 <?php function page_title($url) { $fp = file_get_contents($url); if (!$fp) return null; $res = preg_match("/<title>(.*)<\/title>/siU", $fp, $title_matches); if (!$res) return null; // Clean up title: remove EOL's and excessive whitespace. $title = preg_replace('/\s+/', ' ', $title_matches[1]); $title = trim($title); return $title; } ?> 

Возьмем вихрь на следующем входе:

 print page_title("http://www.google.com/"); 

Выведено: Google

Надеюсь, достаточно общего для вашего использования. Если вам нужно что-то более мощное, может не помешать потратить немного времени на изучение парсеров HTML.

EDIT: добавлена ​​проверка ошибок. Извините, извините.

или сделать эту простую функцию чуть более пуленепробиваемой:

 function page_title($url) { $page = @file_get_contents($url); if (!$page) return null; $matches = array(); if (preg_match('/<title>(.*?)<\/title>/', $page, $matches)) { return $matches[1]; } else { return null; } } echo page_title('http://google.com'); 

Вы можете получить его без выражений reg:

 $title = ''; $dom = new DOMDocument(); if($dom->loadHTMLFile($urlpage)) { $list = $dom->getElementsByTagName("title"); if ($list->length > 0) { $title = $list->item(0)->textContent; } } 

Regex?

Используйте cURL для получения содержимого переменной $ htmlSource.

 preg_match('/<title>(.*)<\/title>/iU', $htmlSource, $titleMatches); print_r($titleMatches); 

посмотрите, что у вас есть в этом массиве.

Большинство людей говорят об HTML-переходе, хотя вы должны использовать парсер, поскольку регулярные выражения могут быть ненадежными.

Другие ответы дают более подробную информацию 🙂

Мне нравится использовать SimpleXml с regex's, это из решения, которое я использую для захвата нескольких заголовков ссылок со страницы в библиотеке OpenID, которую я создал. Я адаптировал его для работы с заголовком (хотя обычно есть только один).

 function getTitle($sFile) { $sData = file_get_contents($sFile); if(preg_match('/<head.[^>]*>.*<\/head>/is', $sData, $aHead)) { $sDataHtml = preg_replace('/<(.[^>]*)>/i', strtolower('<$1>'), $aHead[0]); $xTitle = simplexml_import_dom(DomDocument::LoadHtml($sDataHtml)); return (string)$xTitle->head->title; } return null; } echo getTitle('http://stackoverflow.com/questions/399332/fastest-way-to-retrieve-a-title-in-php'); 

По иронии судьбы эта страница имеет «тег заголовка» в теге заголовка, который иногда вызывает проблемы с чистыми решениями regex.

Это решение не является совершенным, так как это строчные теги, которые могут вызвать проблему для вложенного тега, если важно форматирование / случай (например, XML), но есть способы, которые немного связаны с этой проблемой.