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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
25
0
46 392
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Регулярное выражение?

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

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

print_r($titleMatches);

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

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

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

возможно, его следует изменить на не жадный, чтобы было безопаснее

Alexei Tenitski 30.12.2008 05:11

Но как мне получить $ htmlSource?

Queeken 30.12.2008 05:11

В этом случае, я думаю, можно с уверенностью предположить, что синтаксический анализатор окажется излишним. / соглашаемся на нежадное сопоставление

Will Bickford 30.12.2008 05:13

Вы можете получить $ htmlSource с помощью curl или fopen.

Will Bickford 30.12.2008 05:13

Я искал лучший способ сделать это, но похоже, что большинство людей используют предложенное вами решение как быстрый метод для получения заголовка. Пожалуйста, подумайте об использовании модификатора 's', я видел странные ситуации, когда новая строка прерывала регулярное выражение

rmontagud 17.11.2009 14:55
Ответ принят как подходящий
<?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.

scronide 02.01.2009 22:46

Ой. Слишком верно. Если preg_match не получит результата, ссылка на $ title_matches будет заблокирована. Приведу немного.

Ed Carrel 07.01.2009 04:12

Теги заголовков Facebook выглядят так: <title id = "pageTitle">

Luke 13.11.2015 04:55

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

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');

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

AmbroseChapel 30.12.2008 15:06

Правда, пользуетесь @?

Louis-Marie Matthews 20.04.2018 20:17

@ Louis-MarieMatthews Man, это ответ из 2008 года, тогда все было совсем иначе. Фиксированный.

Alexei Tenitski 21.04.2018 00:25

Странно, но почему-то прочитал 2017 год! В любом случае никогда не поздно получить исправленные ответы, поскольку новички могут получить к нему доступ в будущем.

Louis-Marie Matthews 21.04.2018 00:30

Мне нравится использовать 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.

NewEndian 03.03.2018 20:39

Вы можете вызвать в libxml_use_internal_errors(true); перед использованием DOMDocument. К сожалению, базовая библиотека, которую DOMDocument использует для синтаксического анализа HTML (libxml), на сегодняшний день все еще не поддерживает HTML5 (в конце концов, это библиотека XML) и будет выдавать предупреждения для семантических тегов HTML5 (например, <article> или <main>). К сожалению, альтернативы подавлению ошибок здесь нет. См. Также stackoverflow.com/a/6090728/2459834

Domenico De Felice 20.06.2018 16:25

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

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

Другие вопросы по теме