我正在将一些htmls转移到其他服务器。 我做的是,我采用原始的html,我做一些解析来摆脱头和东西。
libxml_use_internal_errors(true);
$full_dom->loadHTML($html);
libxml_use_internal_errors(false);
$full_dom = $full_dom->getElementsByTagName('body')->item(0);
foreach($full_dom->childNodes as $child_node) {
$body->appendChild($body->importNode($child_node, true));
}
此代码不是问题。在$ body现在我有干净的HTML,这很好。
我需要对原始html中的图像进行base46编码,对于每个节点,有节点img,我得到文件,原始src指向
$picture = file_get_contents($item_path);
我对base64进行了编码
$picture_data = base64_encode($picture);
如果我转储$ picture_data,我会得到正确的base64编码字符串。 然后我用这个src属性覆盖节点
$node->setAttribute("src", "data:image/jpeg;base64,".$picture_data);
如果我var_dump $ node-> getAttribute(“src”),则该节点的src属性被looooong字符串正确替换。哪个好。
问题出现了:
$html = $body->saveHTML();
var_dumping $ html显示,最后一个base64编码图片的字符串每次都在同一个位置被切断。最后一张图片大小超过1MB ..
例如,这是我的html不起作用:
<body>
<img src="/content_storage/storage/389/Jellyfish.jpg" alt="" width="133" height="100" /><br /><br /><br />Link do<a href="http://www.subjectx.net"> zunanje vsebine</a><br /><br /><img src="/content_storage/storage/656/WallpaperFusion-lac-de-savine-3840x1200-W.jpg" alt="" width="3840" height="1200" />
</body>
BUT!如果我在最后添加另一个元素:
<body>
<img src="/content_storage/storage/389/Jellyfish.jpg" alt="" width="133" height="100" /><br /><br /><br />Link do<a href="http://www.subjectx.net"> zunanje vsebine</a><br /><br /><img src="/content_storage/storage/656/WallpaperFusion-lac-de-savine-3840x1200-W.jpg" alt="" width="3840" height="1200" /><a href="#">aaa</a>
</body>
它按预期工作,base64编码图片的字符串以// Z结尾,此html字符串被转移到其他服务器,图片显示在该服务器上。 也行,如果我改变这两张图片的顺序,在身体的开始处将较小的一张放在大一张大的地方。
我错过了什么?
EDIT1: 我试图phpfiddle它,但更大的图像base64_encoded,源代码太大(限制是250k)。我使用相同,较小的图片两次,但这种错误并没有发生。
http://phpfiddle.org/main/code/x3gc-4rp7
所以我猜它与图片大小/长度有关..
EDIT2: 在base64_encode()周围添加chunk_split()也无济于事。
EDIT3: 我有var_dumped整个节点,而不只是“src”属性和节点本身正确形成,base64字符串是完整的。
答案 0 :(得分:1)
我有同样的问题,我找到了saveHTML()的替代品。你可以用这个:
$full_dom->documentElement->c14n();
如果没有被切断,您将获得完整的HTML。但是c14n()会将节点规范化为字符串。