downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

http_build_query> <get_headers
Last updated: Fri, 24 Jul 2009

view this page in

get_meta_tags

(PHP 4, PHP 5)

get_meta_tags파일에서 모든 메타 태그 내용 요소를 추출하여 배열로 반환

설명

array get_meta_tags ( string $filename [, bool $use_include_path ] )

filename 파일을 열어서 줄 단위로 <meta> 태그를 해석합니다. </head>에서 해석을 종료합니다.

인수

filename

문자열로 주어지는 HTML 파일 경로. 로컬 파일이나 URL일 수 있습니다.

Example #1 get_meta_tags()가 해석하는 것

<meta name="author" content="name">
<meta name="keywords" content="php documentation">
<meta name="DESCRIPTION" content="a php manual">
<meta name="geo.position" content="49.33;-86.59">
</head> <!-- 여기서 해석 종료 -->

(라인 종료에 주의하십시오 - PHP는 입력을 해석하는 내부 함수를 사용하기 때문에 맥 파일은 유닉스에서 작동하지 않습니다)

use_include_path

use_include_pathTRUE로 설정하면 include_path 지시어에 따른 표준 포함 경로에 따라서 파일 열기를 시도합니다. 이는 로컬 파일에 사용되며, URL에는 사용되지 않습니다.

반환값

모든 해석한 메타 태그를 가진 배열을 반환합니다.

반환되는 배열에서 name 속성값이 키가 되고, content 속성값이 값이 됩니다. 그러므로, 간단하게 표준 배열 함수를 사용하여 변환하거나 하나의 값에 접근할 수 있습니다. name 속성값의 특수 문자는 '_'로 치환하고, 나머지는 소문자로 변경합니다. 두 메타 태그가 같은 이름을 가지면, 마지막 것만을 반환합니다.

변경점

버전 설명
4.0.5 따옴표 없는 HTML 속성 지원 추가

예제

Example #2 get_meta_tags()가 반환하는 것

<?php
// 위의 태그가 www.example.com에 있다고 가정하면
$tags get_meta_tags('http://www.example.com/');

// 키가 전부 소문자가 되었고,
// .이 _로 치환되었다는 점에 주의하십시오.
echo $tags['author'];       // name
echo $tags['keywords'];     // php documentation
echo $tags['description'];  // a php manual
echo $tags['geo_position']; // 49.33;-86.59
?>

참고



http_build_query> <get_headers
Last updated: Fri, 24 Jul 2009
 
add a note add a note User Contributed Notes
get_meta_tags
jstel at 126 dot com
14-Jul-2009 04:36
this function could get each meta of html content , and stripped all js and css.

<?php
function get_meta_data($content)
{
   
$content = strtolower($content);
   
$content = preg_replace("'<style[^>]*>.*</style>'siU",'',$content);  // strip js
   
$content = preg_replace("'<script[^>]*>.*</script>'siU",'',$content); // strip css
   
$split = explode("\n",$content);
    foreach (
$split as $k => $v)
    {
        if (
strpos(' '.$v,'<meta')) {
            
preg_match_all(
"/<meta[^>]+(http\-equiv|name)=\"([^\"]*)\"[^>]" . "+content=\"([^\"]*)\"[^>]*>/i",
$v, $split_content[],PREG_PATTERN_ORDER);;
        }
    }
    return
$split_content;
}
?>
Antonio - Malaga
10-Feb-2009 10:21
It's not work if meta syntax not have trailing slash.
doob_ at gmx dot de
27-Nov-2008 12:12
<?php

/*
** Extracts and formats meta tag content
*/

function get_meta_data($url, $searchkey='') {   
   
$data = get_meta_tags($url);    // get the meta data in an array
   
foreach($data as $key => $value) {
        if(
mb_detect_encoding($value, 'UTF-8, ISO-8859-1', true) != 'ISO-8859-1') {    // check whether the content is UTF-8 or ISO-8859-1
           
$value = utf8_decode($value);    // if UTF-8 decode it
       
}
       
$value = strtr($value, get_html_translation_table(HTML_ENTITIES));    // mask the content
       
if($searchkey != '') {    // if only one meta tag is in demand e.g. 'description'
           
if($key == $searchkey) {
               
$str = $value;    // just return the value
           
}
        } else {   
// all meta tags
           
$pattern = '/ |,/i';    // ' ' or ','
           
$array = preg_split($pattern, $value, -1, PREG_SPLIT_NO_EMPTY);    // split it in an array, so we have the count of words           
           
$str .= '<p><span style="display:block;color:#000000;font-weight:bold;">' . $key . ' <span style="font-weight:normal;">(' . count($array) . ' words | ' . strlen($value) . ' chars)</span></span>' . $value . '</p>';    // format data with count of words and chars
       
}
    }
    return
$str;
}

$content .= get_meta_data("http://www.example.com/");
/*
output looks like this:

description (23 words | 167 chars)
SELFHTML 8.1.2 - Die bekannte Dokumentation zu HTML, JavaScript und CGI/Perl - Tutorial und Referenz, mit etlichen Zusatztips zu Design, Grafik, Projektverwaltung usw.

keywords (13 words | 119 chars)
SELFHTML, HTML, Dynamic HTML, JavaScript, CGI, Perl, Grafik, WWW-Seiten, Web-Seiten, Hilfe, Dokumentation, Beschreibung

etc.

*/

$content .= get_meta_data("http://www.example.com/", "description");
/*
output looks like this:

SELFHTML 8.1.2 - Die bekannte Dokumentation zu HTML, JavaScript und CGI/Perl - Tutorial und Referenz, mit etlichen Zusatztips zu Design, Grafik, Projektverwaltung usw.
*/

?>
diel at caroes dot be
16-Jan-2008 06:38
Quick meta data grabber
[code]
if(get_meta_tags('http://'.$_POST['pagina'])){
        print '<font class="midden">Meta data from http://'.$_POST['pagina'].'</font>';
        $metadata = get_meta_tags('http://'.$_POST['pagina']);
        echo '<table width="100%">';
        print '<tr><td>Meta</td><td>Waarde</td></tr>';
        foreach($metadata as $naam => $waarde){
            echo '<tr><td valign="top">'.$naam.'</td><td>'.$waarde.'</td></tr>';
        }
        print '</table>';
    }else{
        print '
        <div class="red_h">Incorrect</div>
        ';
    }
[/code]
dev at No_SpAm dot phpartist dot com
03-Feb-2007 03:05
Please consider that get_meta_tags and get_headers returns error when you try to connect a secure site (https) if you did'nt enable ssl support. For PHP socket functions like fsockopen, the same error occures.
roganty at gmail dot com
19-Aug-2006 10:33
This is a slight amendment to jimmyxx at gmail dot com function

I tried using the regex displayed in his code, and php threw up a couple of errors

Below is the correct regular expression that works
(Please note that I had to split the regex into strings because php.net was complaining about the line being to long)
<?php
preg_match_all
(
  
"|<meta[^>]+name=\"([^\"]*)\"[^>]" . "+content=\"([^\"]*)\"[^>]+>|i",
  
$html, $out,PREG_PATTERN_ORDER);
?>

The problem was due to the quotes being incorrectly escaped.
I hope this helps anyone who has been having problems with his code
jimmyxx at gmail dot com
20-Sep-2005 07:37
I used this as part of my mini php search based search engine - it really slowed the whole thing down. I wrote this function to read HTML (just fetch the file or use something like snoopy) and extract the meta data via a simple regex, works a treat and made my crawler much faster:

<?php

function get_meta_data($html) {

   
preg_match_all(
   
"|<meta[^>]+name=\\"([^"]*)\\"[^>]+content="([^\\"]*)"[^>]+>|i"$html, $out,PREG_PATTERN_ORDER);

    for (
$i=0;$i < count($out[1]);$i++) {
       
// loop through the meta data - add your own tags here if you need
       
if (strtolower($out[1][$i]) == "keywords") $meta['keywords'] = $out[2][$i];
        if (
strtolower($out[1][$i]) == "description") $meta['description'] = $out[2][$i];
    }

return
$meta;   
}

?>
mariano at cricava dot com
13-Sep-2005 12:18
Based on Michael Knapp's code, and adding some regex, here's a function that will get all meta tags and the title based on a URL. If there's an error, it will return false. Using the function getUrlContents(), also included, it takes care of META REFRESH re-directions, following up to the specified number of redirections. Please note that the regular expressions included were split into strings because php.net was complaining about the line being to long ;)

<?php
function getUrlData($url)
{
   
$result = false;
   
   
$contents = getUrlContents($url);

    if (isset(
$contents) && is_string($contents))
    {
       
$title = null;
       
$metaTags = null;
       
       
preg_match('/<title>([^>]*)<\/title>/si', $contents, $match );

        if (isset(
$match) && is_array($match) && count($match) > 0)
        {
           
$title = strip_tags($match[1]);
        }
       
       
preg_match_all('/<[\s]*meta[\s]*name="?' . '([^>"]*)"?[\s]*' . 'content="?([^>"]*)"?[\s]*[\/]?[\s]*>/si', $contents, $match);
       
        if (isset(
$match) && is_array($match) && count($match) == 3)
        {
           
$originals = $match[0];
           
$names = $match[1];
           
$values = $match[2];
           
            if (
count($originals) == count($names) && count($names) == count($values))
            {
               
$metaTags = array();
               
                for (
$i=0, $limiti=count($names); $i < $limiti; $i++)
                {
                   
$metaTags[$names[$i]] = array (
                       
'html' => htmlentities($originals[$i]),
                       
'value' => $values[$i]
                    );
                }
            }
        }
       
       
$result = array (
           
'title' => $title,
           
'metaTags' => $metaTags
       
);
    }
   
    return
$result;
}

function
getUrlContents($url, $maximumRedirections = null, $currentRedirection = 0)
{
   
$result = false;
   
   
$contents = @file_get_contents($url);
   
   
// Check if we need to go somewhere else
   
   
if (isset($contents) && is_string($contents))
    {
       
preg_match_all('/<[\s]*meta[\s]*http-equiv="?REFRESH"?' . '[\s]*content="?[0-9]*;[\s]*URL[\s]*=[\s]*([^>"]*)"?' . '[\s]*[\/]?[\s]*>/si', $contents, $match);
       
        if (isset(
$match) && is_array($match) && count($match) == 2 && count($match[1]) == 1)
        {
            if (!isset(
$maximumRedirections) || $currentRedirection < $maximumRedirections)
            {
                return
getUrlContents($match[1][0], $maximumRedirections, ++$currentRedirection);
            }
           
           
$result = false;
        }
        else
        {
           
$result = $contents;
        }
    }
   
    return
$contents;
}
?>

Here's an example of its usage. Check that the included URL has a META REFRESH redirection:

<?php
$result
= getUrlData('http://www.marianoiglesias.com.ar/');

echo
'<pre>'; print_r($result); echo '</pre>';

?>

For the above code the output would be:

<?php
Array
(
    [
title] => Mariano Iglesias: El Eternauta   
   
[metaTags] => Array
        (
            [
description] => Array
                (
                    [
html] => <meta name="description" content="Java, PHP, and some other technological mumble jumble. Also, some real-life stuff as well." />
                    [
value] => Java, PHP, and some other technological mumble jumble. Also, some real-life stuff as well.
                )

            [
DC.title] => Array
                (
                    [
html] => <meta name="DC.title" content="Mariano Iglesias - Weblog" />
                    [
value] => Mariano Iglesias - Weblog
               
)

            [
ICBM] => Array
                (
                    [
html] => <meta name="ICBM" content="-34.6017, -58.3956" />
                    [
value] => -34.6017, -58.3956
               
)

            [
geo.position] => Array
                (
                    [
html] => <meta name="geo.position" content="-34.6017;-58.3956" />
                    [
value] => -34.6017;-58.3956
               
)

            [
geo.region] => Array
                (
                    [
html] => <meta name="geo.region" content="AR-BA">
                    [
value] => AR-BA
               
)

            [
geo.placename] => Array
                (
                    [
html] => <meta name="geo.placename" content="Buenos Aires">
                    [
value] => Buenos Aires
               
)

        )

)
?>
Michael Knapp
12-Mar-2005 08:47
Tim's code is good (thanks Tim), except it won't work very well if the tag is part of a long non-breaking string.

E.g. try getting the title from Google Maps (http://www.google.com/maps).

A better solution is:

<?php
$title
= "";
   
if (
$fp = @fopen( $_POST['url'], 'r' )) {

   
$cont = "";
   
   
// read the contents
   
while( !feof( $fp ) ) {
      
$buf = trim(fgets( $fp, 4096 )) ;
      
$cont .= $buf;
    }

   
// get tag contents
   
@preg_match( "/<title>([a-z 0-9]*)<\/title>/si", $cont, $match );
   
   
// tag contents
   
$title = strip_tags(@$match[ 1 ]);
}

?>

Note the strip_tags. Another thing to be careful of is to check for ", <, and >. You will need to strip those out if you are posting the output to a form.

Also, it is probably best to use the /i modifier, because some people might code <TITLE> etc...
rehfeld
06-Feb-2005 02:45
in response to
jp at webgraphe dot com

this function grabs meta tags, not http headers

if you need the headers

<?php

$fp
= fopen('http://example.org/somepage.html', 'r');

// the variable $http_response_header magically appears
print_r($http_response_header);

// or
$meta_data = stream_get_meta_data($fp);
print_r($meta_data);

?>
tim dot bennett at haveaniceplay dot com
01-Feb-2005 03:43
If you want to get the contents of tags other than meta you can use:

<?php

$page
= "http://www.mysite.com/apage.php";

   
// tags
   
$start = '<atag>';
   
$end = '<\/atag>';

   
// open the file
   
$fp = fopen( $page, 'r' );

   
$cont = "";

   
// read the contents
   
while( !feof( $fp ) ) {
       
$buf = trim( fgets( $fp, 4096 ) );
       
$cont .= $buf;
    }
   
   
// get tag contents
   
preg_match( "/$start(.*)$end/s", $cont, $match );

   
// tag contents
   
$contents = $match[ 1 ];

?>
jp at webgraphe dot com
13-Dec-2003 01:37
If the URL is doing a redirection using the headers (like you would do with PHP function header("Location: URL");), the page has no content (in general). It appears get_meta_tags() doesn't catch that kind of redirection (like cURL would do) and it lead me to a timeout of my script.

I experienced this in a spider I wrote in order to feed my database of all available pages on my site and one link was linking to a page that simply has the following code:

<?php
  header
("Location: sections.php?section=home");
  exit();
?>

That made my script hang for a moment and apparently, get_meta_tags() wasn't even able to return me an error.

JP.
bill.neumann at hatworld.com
13-Mar-2003 03:50
The get_meta_tags function does not seem to be able to grab values if there are spaces between the attribute, the equal sign, and the opening quote marks.
20-Dec-2001 07:01
Tested PHP 4.0.6

get_meta_tags() seems to look only in the beginning of a file, meaning that e.g. if there is a lot of PHP code before the HTML header it will return nothing ...
Tested using get_meta_tags() on local files with about 9000 characters of PHP code before HTML HEADER.

Workaround: if possible move code after header or if not: include a file.
Ben dot Davis at furman dot edu
30-Jul-2001 10:29
I have found that for large searches, get_meta_tags is very slow.  I created a large search engine for a website that couldnt use a database and I first tried pulling out the meta tags. 
I have found that it is actually much faster to use eregi to pull out the meta tags.  This code below pulls out the description:

if (eregi ("<meta name=\"description\" content=[^>]*", $contents, $descresult))
                                {
                                    $description = explode("<meta name=\"description\" content=", $descresult[0]);
                                    echo "<font face=\"Arial\" size=2>$description[1]</font>";
                                   
                                }
richard at pifmagazine dot com
22-Apr-2000 12:17
Something that is not mentioned above and should be : When using get_meta_tags on a remote PHP page the page will be parsed before the meta tags are returned - so you can capture meta tags generated dynamically (by PHP??) on the remote end.

This DOES NOT work the same way when getting meta tags on local file systems.  Local files are not parsed through the web server before returning to get_meta_tags().  If the META tag is hard-coded into the page, you'll be fine - but if it dynamically generated you will not be able to capture it unless you use the full URL when calling your local files.
richard at pifmagazine dot com
22-Apr-2000 12:00
An Important Note about META tags and this function :  if your META tag contains newline "\n"  characters, get_meta_tags() will return a NULL value for that name property.  Removing the newlines from the source META tag corrects the problem.

http_build_query> <get_headers
Last updated: Fri, 24 Jul 2009
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites