Получение заголовка и мета-тегов с внешнего сайта - PullRequest
51 голосов
/ 14 сентября 2010

Я хочу попробовать выяснить, как получить

<title>A common title</title>
<meta name="keywords" content="Keywords blabla" />
<meta name="description" content="This is the description" />

Несмотря на то, что это организовано в любом порядке, я слышал о PHP Simple HTML DOM Parser, но я не очень хочу его использовать. Возможно ли решение, кроме использования PHP Simple HTML DOM Parser.

preg_match не сможет сделать это, если это неправильный HTML?

Может ли cURL сделать что-то подобное с preg_match?

Facebook делает что-то вроде этого, но оно правильно используется с помощью:

<meta property="og:description" content="Description blabla" />

Я хочу что-то подобное, чтобы, когда кто-то публикует ссылку, он получал заголовок и метатеги. Если мета-теги отсутствуют, они игнорируются или пользователь может установить их самостоятельно (но я сделаю это позже сам).

Ответы [ 20 ]

1 голос
/ 28 февраля 2014
<?php 

// ------------------------------------------------------ 

function curl_get_contents($url) {

    $timeout = 5; 
    $useragent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0'; 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
    $data = curl_exec($ch); 
    curl_close($ch); 

    return $data; 
}

// ------------------------------------------------------ 

function fetch_meta_tags($url) { 

    $html = curl_get_contents($url); 
    $mdata = array(); 

    $doc = new DOMDocument();
    $doc->loadHTML($html);

    $titlenode = $doc->getElementsByTagName('title'); 
    $title = $titlenode->item(0)->nodeValue;

    $metanodes = $doc->getElementsByTagName('meta'); 
    foreach($metanodes as $node) { 
    $key = $node->getAttribute('name'); 
    $val = $node->getAttribute('content'); 
    if (!empty($key)) { $mdata[$key] = $val; } 
    }

    $res = array($url, $title, $mdata); 

    return $res;
}

// ------------------------------------------------------ 

?>
1 голос
/ 06 сентября 2012

Получить метатеги из URL, пример функции php:

function get_meta_tags ($url){
         $html = load_content ($url,false,"");
         print_r ($html);
         preg_match_all ("/<title>(.*)<\/title>/", $html["content"], $title);
         preg_match_all ("/<meta name=\"description\" content=\"(.*)\"\/>/i", $html["content"], $description);
         preg_match_all ("/<meta name=\"keywords\" content=\"(.*)\"\/>/i", $html["content"], $keywords);
         $res["content"] = @array("title" => $title[1][0], "descritpion" => $description[1][0], "keywords" =>  $keywords[1][0]);
         $res["msg"] = $html["msg"];
         return $res;
}

Пример:

print_r (get_meta_tags ("bing.com") );

Получить метатеги php

1 голос
/ 07 января 2013

Легко и встроенная функция PHP.

http://php.net/manual/en/function.get-meta-tags.php

0 голосов
/ 07 сентября 2018

Разве мы не используем OG?

Выбранный ответ хорош, но не работает, когда сайт перенаправлен (очень часто!), И не возвращает тегов OG , которые новый отраслевой стандарт . Вот небольшая функция, которая стала более удобной в 2018 году. Она пытается получить теги OG и возвращается к метатегам, если не может их:

function getSiteOG( $url, $specificTags=0 ){
    $doc = new DOMDocument();
    @$doc->loadHTML(file_get_contents($url));
    $res['title'] = $doc->getElementsByTagName('title')->item(0)->nodeValue;

    foreach ($doc->getElementsByTagName('meta') as $m){
        $tag = $m->getAttribute('name') ?: $m->getAttribute('property');
        if(in_array($tag,['description','keywords']) || strpos($tag,'og:')===0) $res[str_replace('og:','',$tag)] = $m->getAttribute('content');
    }
    return $specificTags? array_intersect_key( $res, array_flip($specificTags) ) : $res;
}

/////////////
//SAMPLE USE:
print_r(getSiteOG("http://www.stackoverflow.com")); //note the incorrect url

/////////////
//OUTPUT:
Array
(
    [title] => Stack Overflow - Where Developers Learn, Share, & Build Careers
    [description] => Stack Overflow is the largest, most trusted online community for developers to learn, shareâ âtheir programming âknowledge, and build their careers.
    [type] => website
    [url] => https://stackoverflow.com/
    [site_name] => Stack Overflow
    [image] => https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon@2.png?v=73d79a89bded
)
0 голосов
/ 17 июля 2018

Улучшен ответ из @shamittomar выше, чтобы получить метатеги (или указанный из источника html)

Может быть улучшено дальше ... отличие от get_meta_tags по умолчанию в php заключается в том, что он работает, даже когда естьUnicode строка

function getMetaTags($html, $name = null)
{
    $doc = new DOMDocument();
    try {
        @$doc->loadHTML($html);
    } catch (Exception $e) {

    }

    $metas = $doc->getElementsByTagName('meta');

    $data = [];
    for ($i = 0; $i < $metas->length; $i++)
    {
        $meta = $metas->item($i);

        if (!empty($meta->getAttribute('name'))) {
            // will ignore repeating meta tags !!
            $data[$meta->getAttribute('name')] = $meta->getAttribute('content');
        }
    }

    if (!empty($name)) {
        return !empty($data[$name]) ? $data[$name] : false;
    }

    return $data;
}
0 голосов
/ 22 июня 2018

У меня это работает по-другому, и я решил поделиться этим. Меньше кода, чем у других, и он нашел здесь . Я добавил несколько вещей, чтобы он загружал метаданные страницы, а не определенную страницу. Я хотел, чтобы это автоматически скопировало заголовок и описание страницы по умолчанию в теги og.

По какой-то причине, любым способом (разными сценариями), который я пробовал, страница загружается очень медленно онлайн , но мгновенно на wamp . Не знаю, почему , поэтому я, вероятно, собираюсь использовать переключатель, поскольку сайт не очень большой.

<?php
$url = 'http://sitename.com'.$_SERVER['REQUEST_URI'];
$fp = fopen($url, 'r');

$content = "";

while(!feof($fp)) {
    $buffer = trim(fgets($fp, 4096));
    $content .= $buffer;
}

$start = '<title>';
$end = '<\/title>';

preg_match("/$start(.*)$end/s", $content, $match);
$title = $match[1];

$metatagarray = get_meta_tags($url);
$description = $metatagarray["description"];

echo "<div><strong>Title:</strong> $title</div>";
echo "<div><strong>Description:</strong> $description</div>";
?>

и в заголовке HTML

<meta property="og:title" content="<?php echo $title; ?>" />
<meta property="og:description" content="<?php echo $description; ?>" />
0 голосов
/ 07 ноября 2016

Я сделал этот небольшой пакет композитора, основываясь на верхнем ответе: https://github.com/diversen/get-meta-tags

composer require diversen/get-meta-tags

А затем:

use diversen\meta;

$m = new meta();

// Simple usage, get's title, description, and keywords by default
$ary = $m->getMeta('https://github.com/diversen/get-meta-tags');
print_r($ary);

// With more params
$ary = $m->getMeta('https://github.com/diversen/get-meta-tags', array ('description' ,'keywords'), $timeout = 10);
print_r($ary);

Требуется CURL и DOMDocument, так какверхний ответ - и построен таким образом, но имеет опцию для установки тайм-аута curl (и для получения всех видов мета-тегов).

0 голосов
/ 14 сентября 2010

Если вы работаете с PHP, посмотрите пакеты Pear на pear.php.net и посмотрите, найдете ли вы что-нибудь полезное для вас.Я эффективно использовал пакеты RSS, и это экономит много времени, при условии, что вы можете следить за тем, как они реализуют свой код, на своих примерах.

В частности, посмотрите на Sax 3 и посмотритеесли это будет работать для ваших нужд.Sax 3 больше не обновляется, но этого может быть достаточно.

0 голосов
/ 30 апреля 2012

Как уже было сказано, это может решить проблему:

$url='/2498501/poluchenie-zagolovka-i-meta-tegov-s-vneshnego-saita';
$meta=get_meta_tags($url);
echo $title=$meta['title'];

//php - Get Title and Meta Tags of External site - Stack Overflow
0 голосов
/ 28 декабря 2013

Вот двухстрочный код PHP класса DOM HTML для получения подробностей META страницы.

$html = file_get_html($link);
$meat_description = $html->find('head meta[name=description]', 0)->content;
$meat_keywords = $html->find('head meta[name=keywords]', 0)->content;
...