PHP file_get_contents和echo修改的元标记

时间:2017-09-28 16:08:18

标签: php domdocument file-get-contents meta-tags

我将带有vars的url发送到php脚本,并希望该脚本根据vars返回带有修改或创建的元标记的相同html页面。 所有工作都很完美,除了未修改的标签在身体而不是头部呈现......

这是我的剧本:

<?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页面,检查是否存在一些元属性,如果没有创建它,然后回显html页面。 问题是,在新生成的html中,所有以前的元标记都被推入正文并且不会在头部呈现... 有线索吗? THX !!!

1 个答案:

答案 0 :(得分:1)

使用一小段XPath来检查meta标签是否存在可能更容易。但主要的是,仅echo新标签不会将它们放在文档结构中。 我所做的是,如果标签不存在,则将它们创建为DOMelement,添加属性,然后将此新标签添加到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>

这只是一个标签,我希望其他标签很容易从代码中复制。