복붙노트

외부 웹 사이트에서 제목 및 메타 태그 얻기

PHP

외부 웹 사이트에서 제목 및 메타 태그 얻기

나는 그걸 얻는 방법을 알아 내려고 노력하고 싶다.

<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 인 경우 preg_match가이를 수행 할 수 없습니까?

preg_match로 cURL을 이와 같이 할 수 있습니까?

페이스 북은 이와 같은 일을하지만 실제로 다음과 같이 사용한다.

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

누군가가 링크를 게시 할 때 제목과 메타 태그를 검색 할 수 있도록이 태그가 필요합니다. 메타 태그가 없으면 태그가 무시되거나 사용자가 직접 설정할 수 있습니다 (하지만 나중에 직접 해보겠습니다).

해결법

  1. ==============================

    1.이것은 그것이되어야하는 방법입니다 :

    이것은 그것이되어야하는 방법입니다 :

    function file_get_contents_curl($url)
    {
        $ch = curl_init();
    
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    
        $data = curl_exec($ch);
        curl_close($ch);
    
        return $data;
    }
    
    $html = file_get_contents_curl("http://example.com/");
    
    //parsing begins here:
    $doc = new DOMDocument();
    @$doc->loadHTML($html);
    $nodes = $doc->getElementsByTagName('title');
    
    //get and display what you need:
    $title = $nodes->item(0)->nodeValue;
    
    $metas = $doc->getElementsByTagName('meta');
    
    for ($i = 0; $i < $metas->length; $i++)
    {
        $meta = $metas->item($i);
        if($meta->getAttribute('name') == 'description')
            $description = $meta->getAttribute('content');
        if($meta->getAttribute('name') == 'keywords')
            $keywords = $meta->getAttribute('content');
    }
    
    echo "Title: $title". '<br/><br/>';
    echo "Description: $description". '<br/><br/>';
    echo "Keywords: $keywords";
    
  2. ==============================

    2.

    <?php
    // Assuming the above tags are at www.example.com
    $tags = get_meta_tags('http://www.example.com/');
    
    // Notice how the keys are all lowercase now, and
    // how . was replaced by _ in the key.
    echo $tags['author'];       // name
    echo $tags['keywords'];     // php documentation
    echo $tags['description'];  // a php manual
    echo $tags['geo_position']; // 49.33;-86.59
    ?>
    
  3. ==============================

    3.get_meta_tags는 제목을 제외하고는 모두 당신을 도울 것입니다. 제목을 얻으려면 그냥 정규식을 사용하십시오.

    get_meta_tags는 제목을 제외하고는 모두 당신을 도울 것입니다. 제목을 얻으려면 그냥 정규식을 사용하십시오.

    $url = 'http://some.url.com';
    preg_match("/<title>(.+)<\/title>/siU", file_get_contents($url), $matches);
    $title = $matches[1];
    

    희망이 도움이됩니다.

  4. ==============================

    4.PHP의 기본 기능 : get_meta_tags ()

    PHP의 기본 기능 : get_meta_tags ()

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

  5. ==============================

    5.가장 좋은 방법은 DOM Parser를 사용하여 총알을 물리는 것입니다. DOM Parser를 사용하는 것은 올바른 방법입니다. 장기적으로 그것은 배우는 것보다 더 많은 시간을 절약 할 것입니다. Regex로 HTML을 파싱하는 것은 신뢰할 수없고 특별한 경우를 견디지 ​​않는 것으로 알려져 있습니다.

    가장 좋은 방법은 DOM Parser를 사용하여 총알을 물리는 것입니다. DOM Parser를 사용하는 것은 올바른 방법입니다. 장기적으로 그것은 배우는 것보다 더 많은 시간을 절약 할 것입니다. Regex로 HTML을 파싱하는 것은 신뢰할 수없고 특별한 경우를 견디지 ​​않는 것으로 알려져 있습니다.

  6. ==============================

    6.제목으로 get_meta_tags가 작동하지 않았습니다.

    제목으로 get_meta_tags가 작동하지 않았습니다.

    이름 속성이있는 메타 태그 만

    <meta name="description" content="the description">
    

    파싱됩니다.

  7. ==============================

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

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

    <?php
    // Assuming the above tags are at www.example.com
    $tags = get_meta_tags('http://www.example.com/');
    
    // Notice how the keys are all lowercase now, and
    // how . was replaced by _ in the key.
    echo $tags['author'];       // name
    echo $tags['keywords'];     // php documentation
    echo $tags['description'];  // a php manual
    echo $tags['geo_position']; // 49.33;-86.59
    ?>   
    
  8. ==============================

    8.불행하게도 PHP 함수 내장 get_meta_tags ()는 name 매개 변수가 필요하며 트위터와 같은 특정 사이트에서는 속성 속성을 사용하지 않습니다. regex와 dom 문서를 섞어서 사용하는이 함수는 웹 페이지에서 메타 태그의 키 배열을 반환합니다. name 매개 변수를 확인한 다음 특성 매개 변수를 확인합니다. 이것은 instragram, pinterest 및 twitter에서 테스트되었습니다.

    불행하게도 PHP 함수 내장 get_meta_tags ()는 name 매개 변수가 필요하며 트위터와 같은 특정 사이트에서는 속성 속성을 사용하지 않습니다. regex와 dom 문서를 섞어서 사용하는이 함수는 웹 페이지에서 메타 태그의 키 배열을 반환합니다. name 매개 변수를 확인한 다음 특성 매개 변수를 확인합니다. 이것은 instragram, pinterest 및 twitter에서 테스트되었습니다.

    /**
     * Extract metatags from a webpage
     */
    function extract_tags_from_url($url) {
      $tags = array();
    
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_HEADER, 0);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    
      $contents = curl_exec($ch);
      curl_close($ch);
    
      if (empty($contents)) {
        return $tags;
      }
    
      if (preg_match_all('/<meta([^>]+)content="([^>]+)>/', $contents, $matches)) {
        $doc = new DOMDocument();
        $doc->loadHTML('<?xml encoding="utf-8" ?>' . implode($matches[0]));
        $tags = array();
        foreach($doc->getElementsByTagName('meta') as $metaTag) {
          if($metaTag->getAttribute('name') != "") {
            $tags[$metaTag->getAttribute('name')] = $metaTag->getAttribute('content');
          }
          elseif ($metaTag->getAttribute('property') != "") {
            $tags[$metaTag->getAttribute('property')] = $metaTag->getAttribute('content');
          }
        }
      }
    
      return $tags;
    }
    
  9. ==============================

    9.json의 경우 -j와 함께 PHP (명령 줄 유틸리티)를 통해 Apache Tika를 사용합니다.

    json의 경우 -j와 함께 PHP (명령 줄 유틸리티)를 통해 Apache Tika를 사용합니다.

    http://tika.apache.org/

    <?php
        shell_exec( 'java -jar tika-app-1.4.jar -j http://www.guardian.co.uk/politics/2013/jul/21/tory-strategist-lynton-crosby-lobbying' );
    ?>
    

    이것은 무작위 보호자 문서의 샘플 출력입니다.

    {
       "Content-Encoding":"UTF-8",
       "Content-Length":205599,
       "Content-Type":"text/html; charset\u003dUTF-8",
       "DC.date.issued":"2013-07-21",
       "X-UA-Compatible":"IE\u003dEdge,chrome\u003d1",
       "application-name":"The Guardian",
       "article:author":"http://www.guardian.co.uk/profile/nicholaswatt",
       "article:modified_time":"2013-07-21T22:42:21+01:00",
       "article:published_time":"2013-07-21T22:00:03+01:00",
       "article:section":"Politics",
       "article:tag":[
          "Lynton Crosby",
          "Health policy",
          "NHS",
          "Health",
          "Healthcare industry",
          "Society",
          "Public services policy",
          "Lobbying",
          "Conservatives",
          "David Cameron",
          "Politics",
          "UK news",
          "Business"
       ],
       "content-id":"/politics/2013/jul/21/tory-strategist-lynton-crosby-lobbying",
       "dc:title":"Tory strategist Lynton Crosby in new lobbying row | Politics | The Guardian",
       "description":"Exclusive: Firm he founded, Crosby Textor, advised private healthcare providers how to exploit NHS \u0027failings\u0027",
       "fb:app_id":180444840287,
       "keywords":"Lynton Crosby,Health policy,NHS,Health,Healthcare industry,Society,Public services policy,Lobbying,Conservatives,David Cameron,Politics,UK news,Business,Politics",
       "msapplication-TileColor":"#004983",
       "msapplication-TileImage":"http://static.guim.co.uk/static/a314d63c616d4a06f5ec28ab4fa878a11a692a2a/common/images/favicons/windows_tile_144_b.png",
       "news_keywords":"Lynton Crosby,Health policy,NHS,Health,Healthcare industry,Society,Public services policy,Lobbying,Conservatives,David Cameron,Politics,UK news,Business,Politics",
       "og:description":"Exclusive: Firm he founded, Crosby Textor, advised private healthcare providers how to exploit NHS \u0027failings\u0027",
       "og:image":"https://static-secure.guim.co.uk/sys-images/Guardian/Pix/pixies/2013/7/21/1374433351329/Lynton-Crosby-008.jpg",
       "og:site_name":"the Guardian",
       "og:title":"Tory strategist Lynton Crosby in new lobbying row",
       "og:type":"article",
       "og:url":"http://www.guardian.co.uk/politics/2013/jul/21/tory-strategist-lynton-crosby-lobbying",
       "resourceName":"tory-strategist-lynton-crosby-lobbying",
       "title":"Tory strategist Lynton Crosby in new lobbying row | Politics | The Guardian",
       "twitter:app:id:googleplay":"com.guardian",
       "twitter:app:id:iphone":409128287,
       "twitter:app:name:googleplay":"The Guardian",
       "twitter:app:name:iphone":"The Guardian",
       "twitter:app:url:googleplay":"guardian://www.guardian.co.uk/politics/2013/jul/21/tory-strategist-lynton-crosby-lobbying",
       "twitter:card":"summary_large_image",
       "twitter:site":"@guardian"
    }
    
  10. ==============================

    10.url, php 함수 예제에서 메타 태그 얻기 :

    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는

  11. ==============================

    11.쉽고 PHP의 내장 기능.

    쉽고 PHP의 내장 기능.

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

  12. ==============================

    12.

    <?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;
    }
    
    // ------------------------------------------------------ 
    
    ?>
    
  13. ==============================

    13.이제 며칠 동안 대부분의 사이트에서 사이트에 메타 태그를 추가하여 사이트 또는 특정 기사 페이지에 대한 정보를 제공합니다. 뉴스 또는 블로그 사이트와 같은.

    이제 며칠 동안 대부분의 사이트에서 사이트에 메타 태그를 추가하여 사이트 또는 특정 기사 페이지에 대한 정보를 제공합니다. 뉴스 또는 블로그 사이트와 같은.

    Open Graph, Schema.Org 등과 같이 필요한 메타 데이터를 제공하는 Meta API를 만들었습니다.

    그것을 확인하십시오 - https://api.sakiv.com/docs

  14. ==============================

    14.PHP로 작업하는 경우 pear.php.net에서 Pear 패키지를 확인하고 유용한 정보가 있는지 확인하십시오. 필자는 RSS 패키지를 효과적으로 사용했으며 예제를 통해 코드를 구현하는 방법을 따르면 많은 시간을 절약 할 수 있습니다.

    PHP로 작업하는 경우 pear.php.net에서 Pear 패키지를 확인하고 유용한 정보가 있는지 확인하십시오. 필자는 RSS 패키지를 효과적으로 사용했으며 예제를 통해 코드를 구현하는 방법을 따르면 많은 시간을 절약 할 수 있습니다.

    구체적으로 Sax 3를 살펴보고 필요에 따라 작동하는지 확인하십시오. 삭스 3은 더 이상 업데이트되지 않지만 충분할 수 있습니다.

  15. ==============================

    15.이미 말했듯이,이 문제를 처리 할 수 ​​있습니다 :

    이미 말했듯이,이 문제를 처리 할 수 ​​있습니다 :

    $url='http://stackoverflow.com/questions/3711357/get-title-and-meta-tags-of-external-site/4640613';
    $meta=get_meta_tags($url);
    echo $title=$meta['title'];
    
    //php - Get Title and Meta Tags of External site - Stack Overflow
    
  16. ==============================

    16.나는이 작은 작곡가 패키지를 최상위 답변을 기반으로 만들었습니다 : https://github.com/diversen/get-meta-tags

    나는이 작은 작곡가 패키지를 최상위 답변을 기반으로 만들었습니다 : 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 timeout을 설정하고 모든 종류의 메타 태그를 가져올 수 있습니다.

  17. ==============================

    17.나는이 일을 다른 방식으로하고 그것을 나눌 것이라고 생각했다. 다른 사람들보다 코드가 적고 여기에서 그것을 발견했습니다. 특정 페이지가 아닌 페이지 메타를로드하기 위해 몇 가지를 추가했습니다. 기본 페이지 제목과 설명을 자동으로 og 태그에 복사하기를 원했습니다.

    나는이 일을 다른 방식으로하고 그것을 나눌 것이라고 생각했다. 다른 사람들보다 코드가 적고 여기에서 그것을 발견했습니다. 특정 페이지가 아닌 페이지 메타를로드하기 위해 몇 가지를 추가했습니다. 기본 페이지 제목과 설명을 자동으로 og 태그에 복사하기를 원했습니다.

    웬일인지, 내가 시도한 방법 (다른 스크립트)에 관계없이, 페이지는 초 저속 온라인이지만 속도가 빠른 순간에로드됩니다. 왜 그렇게 사이트가 거대하지 않기 때문에 나는 아마 스위치 케이스와 함께 가고 있는지 잘 모르겠다.

    <?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; ?>" />
    
  18. ==============================

    18.메타 태그 (또는 html 소스에서 지정된 것)를 얻기 위해 위의 @shamittomar에서 향상된 대답

    메타 태그 (또는 html 소스에서 지정된 것)를 얻기 위해 위의 @shamittomar에서 향상된 대답

    더 나아질 수 있습니다 ... PHP의 기본 get_meta_tags와의 차이점은 유니 코드 문자열이있을 때에도 작동한다는 것입니다.

    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;
    }
    
  19. ==============================

    19.다음은 PHP의 간단한 DOM HTML 클래스의 두 라인 코드입니다.

    다음은 PHP의 간단한 DOM HTML 클래스의 두 라인 코드입니다.

    $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;
    
  20. ==============================

    20.OG를 사용해야하지 않습니까?

    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
    )
    
  21. from https://stackoverflow.com/questions/3711357/getting-title-and-meta-tags-from-external-website by cc-by-sa and MIT license