2012-02-11 16 views
8

Voglio creare un distacco funzionalità simile a quella che usa Facebook (si incolla un link nel testo, dopo colpito e messaggi di un titolo, una descrizione e un'immagine). Mi sono reso conto che è meglio estrarre i meta tag che hanno proprietà come "og: title" e "og: image" perché se uso i tag normali, a volte hanno interruzioni di riga e altre cose e vengono fuori errori .Recupero "di proprietà og" meta tag da URL con PHP

Esiste un modo per recuperare il contenuto di questi tag che utilizzano PHP, ma senza AJAX o di altri parser personalizzati? Il punto di partenza potrebbe essere:

<?php 

$url = $_POST['link']; 

?> 

Otteniamo l'URL della pagina precedente attraverso il metodo POST, ma come al resto?

risposta

4

usare qualcosa come il qui sotto:

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

Trovato questo su How to get Open Graph Protocol of a webpage by php? - ricerca è utile, come è Google!

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

+0

dove metto la variabile URL in questo? $ html o $ doc? – Jakov

+0

Dovrei pensare $ html;) $ doc è OOP – MrJ

+0

Mi dà costantemente "Variabile non definita: rmetas in C: \ xampp \ htdocs \ linkedit \ index.php on line 73 NULL" La riga 73 è var_dump ($ rmetas) ; – Jakov

9

La soluzione:

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

è XPath, farlo in una sola volta, non per due volte: '// meta [@ property = 'og : titolo' o @ property = 'og: description']/@ content' – hakre

+0

se il documento non è valido questo genera un'eccezione, e vorrei usare una semplice espressione regolare per ottenere che invece di analisi del documento completo – Burimi

+0

questo ha funzionato perfettamente, è esattamente quello che stavo cercando! – gcclinux

1

Usiamo Apache Tika via php (linea di comando) con -j per 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'); 
?> 

Questo è un esempio uscita da un articolo del Guardian casuale:

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

Utilizzare questa: https://github.com/baj84/MetaData

E 'facile ed efficiente.

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

questo non sempre funziona. Non ha restituito tag per me su pagine di Twitter. – oknate

0

provare questo .. ha funzionato per me ..

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