Я делаю систему закладок и ищу самый быстрый (самый простой) способ получить название страницы с PHP.
Было бы неплохо иметь что-то вроде $title = page_title($url)
<?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), но есть способы, которые немного связаны с этой проблемой.