【问题标题】:php DOMDocument: element ending up within anotherphp DOMDocument:元素在另一个中结束
【发布时间】:2019-06-23 14:36:45
【问题描述】:

我有一些 HTML 包含(除其他外)p-tags 和 figure-tags,其中包含一个 img-tag。
为简单起见,我将在此处的 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-element 中所有 img-elements 的 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-element 已经移动到了我的figure-element。 为什么会发生这种情况,我可以做些什么来防止它?

Live DEMO

【问题讨论】:

    标签: php domdocument


    【解决方案1】:

    DomDocument 必须有一个根元素,因此它将在第一个顶级元素内移动所有后续兄弟元素。

    您可以最轻松地解决这个问题,方法是使用容器标签为您的内容添加书签,例如

    $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>';
    

    【讨论】:

      【解决方案2】:

      重新排列由您使用的LIBXML_HTML_NOIMPLIED 选项完成。看起来它对您的情况不够稳定。

      看看这个答案:loadHTML LIBXML_HTML_NOIMPLIED on an html fragment generates incorrect tagsHow to saveHTML of DOMDocument without HTML wrapper?

      注意:PHP 5.4 和 Libxml 2.6 loadHTML 现在有一个 $option 参数,它指示 Libxml 如何解析内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-26
        • 2014-10-04
        • 1970-01-01
        • 2011-01-19
        • 2012-05-18
        相关资源
        最近更新 更多