2012-02-11 13 views
8

Quiero crear una función de publicación similar a la que utiliza Facebook (Pega un enlace en el cuadro de texto, publica la publicación y publica un título, una descripción y una imagen). Me di cuenta de que lo mejor es extraer las metaetiquetas que tienen propiedades og como "og: title" y "og: image" porque si uso etiquetas normales, a veces tienen saltos de línea y otras cosas y sale con errores .Obteniendo metaetiquetas "property og" de URL con PHP

¿Hay alguna forma de recuperar el contenido de estas etiquetas utilizando PHP, pero sin AJAX u otros analizadores personalizados? El punto de partida sería:

<?php 

$url = $_POST['link']; 

?> 

Obtenemos la URL de la página anterior mediante el método POST, pero la forma de hacer el resto?

Respuesta

4

usar algo como el siguiente:

libxml_use_internal_errors(true); // Yeah if you are so worried about using @ with warnings 
$doc = new DomDocument(); 
$doc->loadHTML($html); 
$xpath = new DOMXPath($doc); 
$query = '//*/meta[starts-with(@property, \'og:\')]'; 
$metas = $xpath->query($query); 
foreach ($metas as $meta) { 
    $property = $meta->getAttribute('property'); 
    $content = $meta->getAttribute('content'); 
    $rmetas[$property] = $content; 
} 
var_dump($rmetas); 

encontrado esto en How to get Open Graph Protocol of a webpage by php? - búsqueda es muy útil, ya que es Google!

http://www.google.co.uk/search?q=meta+property+og+tags

+0

¿Dónde pongo la variable URL en esto? $ html o $ doc? – Jakov

+0

Creo que $ html;) $ doc es OOP – MrJ

+0

Me está dando constantemente "Variable no definida: rmetas en C: \ xampp \ htdocs \ linkedit \ index.php en la línea 73 NULL" La línea 73 es var_dump ($ rmetas) ; – Jakov

9

La solución es la siguiente:

libxml_use_internal_errors(true); 
$c = file_get_contents("http://url/here"); 
$d = new DomDocument(); 
$d->loadHTML($c); 
$xp = new domxpath($d); 
foreach ($xp->query("//meta[@property='og:title']") as $el) { 
    echo $el->getAttribute("content"); 
} 
foreach ($xp->query("//meta[@property='og:description']") as $el) { 
    echo $el->getAttribute("content"); 
} 
+0

es xpath, hágalo de una vez, no por dos veces: '// meta [@ property = 'og : title 'o @ property =' og: description ']/@ content' – hakre

+0

si el documento no es válido, esto arroja una excepción, y usaría una expresión regular simple para obtener eso en lugar de analizar el documento completo – Burimi

+0

Esto funcionó a la perfección, es exactamente lo que he estado buscando! – gcclinux

1

Utilizamos Apache Tika a través de PHP (utilidad de línea de comandos) con -j para JSON:

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

Esta es una muestra de salida de un artículo de The Guardian al azar:

{ 
    "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" 
} 
3

Utilice esta: https://github.com/baj84/MetaData

Es fácil y eficiente.

$metaData = MetaData::fetch($url); 
var_dump($metaData->tags()); 
+0

esto no siempre funciona. No me devolvió ninguna etiqueta en las páginas de Twitter. – oknate

0

probar este .. que trabajó para mí ..

foreach($linkHtml->find('head meta[property=og:url]') as $url) 
{ 
    echo $url->content.'</br>'; 
} 
Cuestiones relacionadas