$ dom-> saveHTML()切断了html代码

时间:2017-09-26 10:39:12

标签: php dom base64

我正在将一些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字符串是完整的。

1 个答案:

答案 0 :(得分:1)

我有同样的问题,我找到了saveHTML()的替代品。你可以用这个:

$full_dom->documentElement->c14n();

如果没有被切断,您将获得完整的HTML。但是c14n()会将节点规范化为字符串。