Самый быстрый способ получить <title>в PHP - PullRequest
20 голосов
/ 30 декабря 2008

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

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

Ответы [ 7 ]

44 голосов
/ 30 декабря 2008
<?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-парсеров.

РЕДАКТИРОВАТЬ: Добавлено немного проверки ошибок. Вроде поспешила первая версия, извините.

15 голосов
/ 29 мая 2015

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

$title = '';
$dom = new DOMDocument();

if($dom->loadHTMLFile($urlpage)) {
    $list = $dom->getElementsByTagName("title");
    if ($list->length > 0) {
        $title = $list->item(0)->textContent;
    }
}
9 голосов
/ 30 декабря 2008

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

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');
5 голосов
/ 30 декабря 2008

Regex?

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

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

print_r($titleMatches);

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

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

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

2 голосов
/ 08 февраля 2019

Я также делаю систему закладок и обнаружил, что начиная с PHP 5 вы можете использовать stream_get_line для загрузки удаленной страницы только до закрывающего заголовка (вместо загрузки всего файла), а затем избавиться от того, что до открывающий тег заголовка с explode (вместо regex ).

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 , который напомнил мне, что теги заголовков могут иметь атрибуты.

1 голос
/ 25 марта 2018

Функция для обработки тегов заголовков, к которым добавлены атрибуты

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;
1 голос
/ 31 декабря 2008

Мне нравится использовать 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('/386473/samyi-bystryi-sposob-poluchit-title-v-php');

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...