【问题标题】:$dom->saveHTML() cuts off html code$dom->saveHTML() 截断 html 代码
【发布时间】:2018-03-16 18:08:49
【问题描述】:

我正在将一些 html 传输到其他服务器。 我所做的是,我采用原始 html,我做一些解析以摆脱 head 和东西。

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>

但是!如果我像这样在末尾添加另一个元素:

<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 字符串被传输到其他服务器,图片在该服务器上显示。 也可以,如果我更改这两张图片的顺序,将较小的一张放在大一张的位置,将大的放在正文的开头..

我错过了什么?

编辑1: 我尝试过 phpfiddle 它,但使用较大的图像 base64_encoded,源代码太大(限制为 250k)。我使用了相同的较小的图片两次,但没有发生此错误。

http://phpfiddle.org/main/code/x3gc-4rp7

所以我想这与图片大小/长度有关..

编辑2: 在 base64_encode() 周围添加 chunk_split() 也无济于事。

编辑3: 我有 var_dumped 整个节点,而不仅仅是“src”属性,并且节点本身是正确形成的,base64 字符串是完整的。

【问题讨论】:

  • 如果没有深入研究 PHP 的源代码,我无法真正发表评论,但我怀疑 DOMDocument 中的给定 DOM 节点可以容纳多少数据是有上限的。您是否尝试过替换较小的图像并查看它是否有效?另外,请记住,内嵌图像从来都不是很大的!

标签: php dom base64


【解决方案1】:

我遇到了同样的问题,我找到了 saveHTML() 的替代方法。你可以使用这个:

$full_dom->documentElement->c14n();

您将获得完整的 HTML 而不会被截断。但是 c14n() 会将节点规范化为字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-24
    • 2022-01-16
    • 2020-07-25
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多