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


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

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

Author: Adi, 2008-12-30

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.

ПРАВКА: Добавлена небольшая проверка ошибок. Вроде как поторопился с первой версией, извини.

 39
Author: Ed Carrel, 2011-10-23 09:29:16

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

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

if($dom->loadHTMLFile($urlpage)) {
    $list = $dom->getElementsByTagName("title");
    if ($list->length > 0) {
        $title = $list->item(0)->textContent;
    }
}
 13
Author: Lukas, 2015-05-29 07:25:26

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

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');
 9
Author: Alexei Tenitski, 2018-04-20 21:25:29

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

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

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

print_r($titleMatches);

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

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

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

 5
Author: alex, 2008-12-30 02:24:58

Мне нравится использовать 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), но есть способы, которые немного сложнее решить эту проблему.

 1
Author: null, 2008-12-31 08:15:00

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

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;
 0
Author: PlugTrade.com, 2018-03-24 22:05:14