gpt4 book ai didi

PHP DOMDocument saveHTML 打破格式

转载 作者:行者123 更新时间:2023-12-03 18:38:23 26 4
gpt4 key购买 nike

为什么这个代码:

$doc = new DOMDocument();
$doc->loadHTML($this->content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$imgNodes = $doc->getElementsByTagName('img');

if ($imgNodes->length > 0) {
$inlineImage = new Image();
$inlineImage->setPublicDir($publicDirPath);

foreach ($imgNodes as $imgNode) {
$inlineImage->setUri($imgNode->getAttribute('src'));
$inlineImage->setName(basename($inlineImage->getUri()));

if ($inlineImage->getUri() != $dstPath.$inlineImage->getName()) {
$inlineImage->move($dstPath);

$imgNode->setAttribute('src', $dstPath.'/'.$inlineImage->getName());
}
}

$this->content = $doc->saveHtml();

}

在此代码上执行:
<p><img alt="fluid cat" src="/images/tmp/fluid-cat.jpg"></p><p><img alt="pandas" src="/images/tmp/pandas.jpg"></p>

导致此代码:
<p><img alt="fluid cat" src="/images/full/2016-09/fluid-cat.jpg"><p><img alt="pandas" src="/images/full/2016-09/pandas.jpg"></p></p>

为什么它将两个 img 标签都放在第一个 p 块中?

最佳答案

您的 html 示例没有包含所有元素的根元素。当 LIBXML 解析 html 以构建 DOM 树时,它假定遇到的第一个标签是根元素。结果,第一个标签 </p> 被视为孤立的结束标签(因为它后面有内容)并被自动删除,并在末尾添加 </p> 以关闭根元素。

为了在处理 html 部分(不是整个 html 文档)时避免这些自动修复,您需要添加一个假的根元素。最后,要生成结果字符串,您需要保存这个假根元素的每个子节点。例子:

$html = '<p><img alt="fluid cat" src="/images/tmp/fluid-cat.jpg"></p><p><img alt="pandas" src="/images/tmp/pandas.jpg"></p>';

$doc = new DOMDocument;
$doc->loadHTML( '<div>' . $html . '</div>', LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
# ^-----------------^----- fake root element
$root = $doc->documentElement;

$result = '';

foreach($root->childNodes as $childNode) {
$result .= $doc->saveHTML($childNode);
}

echo $result;

关于PHP DOMDocument saveHTML 打破格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39479994/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com