





Регулярное выражение?
Используйте cURL, чтобы получить содержимое переменной $ htmlSource.
preg_match('/<title>(.*)</title>/iU', $htmlSource, $titleMatches);
print_r($titleMatches);
посмотрите, что у вас есть в этом массиве.
Большинство людей говорят об обходе HTML, хотя вам следует использовать парсер, поскольку регулярные выражения могут быть ненадежными.
Другие ответы содержат более подробную информацию :)
Но как мне получить $ htmlSource?
В этом случае, я думаю, можно с уверенностью предположить, что синтаксический анализатор окажется излишним. / соглашаемся на нежадное сопоставление
Вы можете получить $ htmlSource с помощью curl или fopen.
Я искал лучший способ сделать это, но похоже, что большинство людей используют предложенное вами решение как быстрый метод для получения заголовка. Пожалуйста, подумайте об использовании модификатора 's', я видел странные ситуации, когда новая строка прерывала регулярное выражение
<?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.
Обновлено: добавлена небольшая проверка ошибок. Вроде поторопился с первой версией, извините.
Я почти уверен, что это приведет к ошибке, если шаблон не будет найден. Сначала инициализируйте $ title, назначьте preg_match () логическому значению и проверьте это, прежде чем пытаться получить доступ к первому элементу массива $ title_matches.
Ой. Слишком верно. Если preg_match не получит результата, ссылка на $ title_matches будет заблокирована. Приведу немного.
Теги заголовков Facebook выглядят так: <title id = "pageTitle">
или сделав эту простую функцию более пуленепробиваемой:
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');
Да, однажды я попался на страницу с двумя тегами заголовков. Добавьте вопросительный знак после звездочки.
Правда, пользуетесь @?
@ Louis-MarieMatthews Man, это ответ из 2008 года, тогда все было совсем иначе. Фиксированный.
Странно, но почему-то прочитал 2017 год! В любом случае никогда не поздно получить исправленные ответы, поскольку новички могут получить к нему доступ в будущем.
Мне нравится использовать SimpleXml с регулярными выражениями, это решение, которое я использую для захвата нескольких заголовков ссылок со страницы в созданной мной библиотеке 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');
По иронии судьбы на этой странице есть «тег заголовка» в теге заголовка, который иногда вызывает проблемы с решениями, использующими чистое регулярное выражение.
Это решение не идеально, так как теги в нижнем регистре могут вызвать проблему для вложенного тега, если форматирование / регистр были важны (например, XML), но есть способы, которые немного более задействованы для решения этой проблемы.
Вы можете получить это без выражений reg:
$title = '';
$dom = new DOMDocument();
if ($dom->loadHTMLFile($urlpage)) {
$list = $dom->getElementsByTagName("title");
if ($list->length > 0) {
$title = $list->item(0)->textContent;
}
}
Это первое решение, которое работает с deadspin.com.
Вы можете вызвать в libxml_use_internal_errors(true); перед использованием DOMDocument. К сожалению, базовая библиотека, которую DOMDocument использует для синтаксического анализа HTML (libxml), на сегодняшний день все еще не поддерживает HTML5 (в конце концов, это библиотека XML) и будет выдавать предупреждения для семантических тегов HTML5 (например, <article> или <main>). К сожалению, альтернативы подавлению ошибок здесь нет. См. Также stackoverflow.com/a/6090728/2459834
Функция для обработки тегов заголовков, к которым добавлены атрибуты
function get_title($html)
{
preg_match("/<title(.+)</title>/siU", $html, $matches);
if ( !empty( $matches[1] ) )
{
$title = $matches[1];
if ( strstr($title, '>') )
{
$title = explode( '>', $title, 2 );
$title = $title[1];
return trim($title);
}
}
}
$html = '<tiTle class = "aunt">jemima</tiTLE>';
$title = get_title($html);
echo $title;
Я также делаю систему закладок и обнаружил, что с PHP 5 вы можете использовать stream_get_line для загрузки удаленной страницы только до закрывающего тега заголовка (вместо загрузки всего файла), а затем избавиться от того, что находится перед открывающим тегом заголовка с помощью explode (вместо регулярное выражение).
function page_title($url) {
$title = false;
if ($handle = fopen($url, "r")) {
$string = stream_get_line($handle, 0, "</title>");
fclose($handle);
$string = (explode("<title", $string))[1];
if (!empty($string)) {
$title = trim((explode(">", $string))[1]);
}
}
return $title;
}
Последний explode - спасибо отвечать PlugTrade, который напомнил мне, что теги заголовков могут иметь атрибуты.
возможно, его следует изменить на не жадный, чтобы было безопаснее