php DOMDocument:元素在另一个元素中结束
php DOMDocument: element ending up within another
我有一些 HTML 包含(除其他外)p
-标签和 figure
-标签,其中包含一个 img
-标签。
为了简单起见,我将在 PHP 变量中的 HTML 中定义一个示例:
$content = '<figure class="image image-style-align-left">
<img src="https://placekitten.com/g/200/300"></figure>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>';
我使用 DOMDocument 获取 $content
,在这个例子中,我将更改 figure
元素中所有 img
元素的 src
属性:
$dom = new DOMDocument();
libxml_use_internal_errors(true);
// this needs to be encoded otherwise special characters get messed up.
$domPart = mb_convert_encoding($content, 'HTML-ENTITIES', "UTF-8");
$dom->loadHTML($domPart, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$domFigures = $dom->getElementsByTagName('figure');
foreach ($domFigures as $domFigure) {
$img = $domFigure->getElementsByTagName('img')[0];
if ($img) {
$img->setAttribute('src', "https://placekitten.com/g/400/500");
}
}
$result = $dom->saveHTML();
结果是:
<figure class="image image-style-align-left">
<img src="https://placekitten.com/g/400/500">
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>
</figure>
不知何故,我的 p
-元素已移入我的 figure
-元素。 为什么会发生这种情况,我该如何预防?
re-arrangement 由您使用的 LIBXML_HTML_NOIMPLIED
选项完成。看起来它对你的情况来说不够稳定。
看看这个答案:loadHTML LIBXML_HTML_NOIMPLIED on an html fragment generates incorrect tags
和
How to saveHTML of DOMDocument without HTML wrapper?
注意:PHP 5.4 和 Libxml 2.6 loadHTML 现在有一个 $option 参数,它指示 Libxml 如何解析内容。
A DomDocument
必须有一个根元素,因此它会将所有后续的兄弟元素移动到第一个 top-level 元素中。
您可以最轻松地解决这个问题,方法是在您的内容中添加一个容器标签,例如
$content = '<div><figure class="image image-style-align-left">
<img src="https://placekitten.com/g/200/300"></figure>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p></div>';
我有一些 HTML 包含(除其他外)p
-标签和 figure
-标签,其中包含一个 img
-标签。
为了简单起见,我将在 PHP 变量中的 HTML 中定义一个示例:
$content = '<figure class="image image-style-align-left">
<img src="https://placekitten.com/g/200/300"></figure>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>';
我使用 DOMDocument 获取 $content
,在这个例子中,我将更改 figure
元素中所有 img
元素的 src
属性:
$dom = new DOMDocument();
libxml_use_internal_errors(true);
// this needs to be encoded otherwise special characters get messed up.
$domPart = mb_convert_encoding($content, 'HTML-ENTITIES', "UTF-8");
$dom->loadHTML($domPart, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$domFigures = $dom->getElementsByTagName('figure');
foreach ($domFigures as $domFigure) {
$img = $domFigure->getElementsByTagName('img')[0];
if ($img) {
$img->setAttribute('src', "https://placekitten.com/g/400/500");
}
}
$result = $dom->saveHTML();
结果是:
<figure class="image image-style-align-left">
<img src="https://placekitten.com/g/400/500">
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>
</figure>
不知何故,我的 p
-元素已移入我的 figure
-元素。 为什么会发生这种情况,我该如何预防?
re-arrangement 由您使用的 LIBXML_HTML_NOIMPLIED
选项完成。看起来它对你的情况来说不够稳定。
看看这个答案:loadHTML LIBXML_HTML_NOIMPLIED on an html fragment generates incorrect tags 和 How to saveHTML of DOMDocument without HTML wrapper?
注意:PHP 5.4 和 Libxml 2.6 loadHTML 现在有一个 $option 参数,它指示 Libxml 如何解析内容。
A DomDocument
必须有一个根元素,因此它会将所有后续的兄弟元素移动到第一个 top-level 元素中。
您可以最轻松地解决这个问题,方法是在您的内容中添加一个容器标签,例如
$content = '<div><figure class="image image-style-align-left">
<img src="https://placekitten.com/g/200/300"></figure>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p></div>';