2017-09-28 103 views
0

我發送一個帶有變量的url到一個php腳本,並希望該腳本根據變量返回修改或創建的meta標籤的相同html頁面。 所有完美的作品,除了未修改的標籤在體內,而不是頭部呈現...PHP file_get_contents和echo修改後的元標記

這裏是我的腳本:

<?php 
$imagetype = 'image/jpeg'; 
$panourl = $_GET["panourl"]; 
$snapshoturl = $_GET["snapshoturl"]; 
$vfw = $_GET["vfw"]; 
$vfh = $_GET["vfh"]; 
$pano_html = file_get_contents($panourl); 

$html = new DOMDocument(); 
@$html->loadHTML($pano_html); 
$meta_og_img = null; 
$meta_og_img_type = null; 
$meta_og_img_width = null; 
$meta_og_img_height = null; 
foreach($html->getElementsByTagName('meta') as $meta) { 
    if($meta->getAttribute('property')=='og:image'){ 
     $meta_og_img = $meta->getAttribute('content'); 
    } 
    if($meta->getAttribute('property')=='og:image:type'){ 
     $meta_og_img_type = $meta->getAttribute('content'); 
    } 
    if($meta->getAttribute('property')=='og:image:width'){ 
     $meta_og_img_width = $meta->getAttribute('content'); 
    } 
    if($meta->getAttribute('property')=='og:image:height'){ 
     $meta_og_img_height = $meta->getAttribute('content'); 
    } 
} 

if (is_null($meta_og_img)) {echo '<meta property="og:image" content="'.$snapshoturl.'"/>'; } 
if (is_null($meta_og_img_type)) {echo '<meta property="og:image:type" content="'.$imagetype.'"/>'; } 
if (is_null($meta_og_img_width)) {echo '<meta property="og:image:width" content="'.$vfw.'"/>'; } 
if (is_null($meta_og_img_height)) {echo '<meta property="og:image:height" content="'.$vfh.'"/>'; } 

$before = array($meta_og_img, $meta_og_img_type, $meta_og_img_width, $meta_og_img_height); 
$after = array($snapshoturl, $imagetype, $vfw, $vfh); 

$pano_html = str_replace($before, $after, $pano_html); 

echo $pano_html->saveHTML(); 
?> 

所以我打開一個HTML頁面,檢查是否存在元proprety存在,如果不創建它,然後回顯HTML頁面。 問題是,在新的HTML生成的所有以前的meta標籤被推入到身體,並沒有呈現在頭... 有線索? THX !!!

+0

如果getAttribute不提供任何內容 - 則使用setAttribute在文檔中創建它。 –

+0

getAttribute完美無缺! 看起來像它的str_replace是問題,如果我刪除這部分老meta標籤留在頭部分??? –

回答

1

使用一小段XPath檢查meta標籤是否存在可能更容易。但最主要的是,只有新標籤纔會將它們放入文檔結構中。 我所做的是,如果標籤不存在,則將它們創建爲DOM元素,添加屬性,然後將此新標籤添加到head部分的開頭。

編輯:我已更新代碼以修改元標記(如果存在),或添加它(如果不存在)。

<?php 
error_reporting (E_ALL); 
ini_set ('display_errors', 1); 

$pano_html = <<< HTML 
<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<meta property="og:image:type" /> 
<title>Insert title here</title> 
</head> 
<body> 

</body> 
</html> 
HTML; 
$snapshoturl = "http://someurl"; 

$html = new DOMDocument(); 
libxml_use_internal_errors(true); 
$html->loadHTML($pano_html); 
$xp = new DOMXPath($html); 

$head = $html->getElementsByTagName("head")[0]; 
$ogImageMeta = $xp->query("//meta[@property='og:image']"); 
if ($ogImageMeta->length == 0) { 
    $newTag = $html->createElement("meta"); 
    $newTag->setAttribute("property", "og:image"); 
    $newTag->setAttribute("content", $snapshoturl); 
    $head->insertBefore($newTag,$head->firstChild); 
} 
else { 
    $ogImageMeta[0]->setAttribute("content", $snapshoturl); 
} 
echo $html->saveHTML(); 

這臺輸出

<!DOCTYPE html> 
<html> 
    <head> 
    <meta property="og:image" content="http://someurl"> 
    <meta charset="UTF-8"> 
    <meta property="og:image:type"> 
    <title>Insert title here</title> 
    </head> 
    <body> 
    </body> 
</html> 

這不僅了一個標籤,我希望別人會很容易從代碼複製。

+0

THX!這是有效的,但如果元存在,只修改內容屬性的代碼是什麼? –

+0

我已經稍微修改了代碼,如果它找到了您想要的元標記,它會設置該屬性。 –

+0

THX奈傑爾,完美的作品! –