Самый быстрый способ получить a в PHP
Я создаю систему закладок и ищу самый быстрый (простой) способ получить заголовок страницы с помощью PHP.
Было бы неплохо иметь что-то вроде $title = page_title($url)
6 answers
<?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.
ПРАВКА: Добавлена небольшая проверка ошибок. Вроде как поторопился с первой версией, извини.
Вы можете получить его без выражений reg:
$title = '';
$dom = new DOMDocument();
if($dom->loadHTMLFile($urlpage)) {
$list = $dom->getElementsByTagName("title");
if ($list->length > 0) {
$title = $list->item(0)->textContent;
}
}
Или сделать эту простую функцию немного более пуленепробиваемой:
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');
Регулярное выражение?
Используйте CURL, чтобы получить содержимое переменной $HTMLSOURCE.
preg_match('/<title>(.*)<\/title>/iU', $htmlSource, $titleMatches);
print_r($titleMatches);
Посмотрите, что у вас есть в этом массиве.
Большинство людей говорят, что для обхода HTML следует использовать синтаксический анализатор, так как регулярные выражения могут быть ненадежными.
Другие ответы содержат более подробную информацию:)
Мне нравится использовать 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), но есть способы, которые немного сложнее решить эту проблему.
Функция для обработки тегов заголовков, к которым добавлены атрибуты
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;