我将带有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 !!!
答案 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>
这只是一个标签,我希望其他标签很容易从代码中复制。