简体   繁体   English

PHP DOM解析器移动关闭Div标签

[英]PHP DOM Parser Moving Closing Div Tag

here's my code: 这是我的代码:

$myHtml = '
<div class="div-class">
    <p>text</p>

    <p><a href="#">text</a></p>
</div>

<ul class="some-class">
    <li><a href="#" target="_blank" title="something something"><img src="" alt=""></a>
    </li>
    <li><a href="" target="_blank" title=""><img src="" alt=""></a>
    </li>
    <li><a href="" target="_blank" title=""><img src=""></a>
    </li>
</ul>
';

$doc = new \DOMDocument();
$doc->loadHTML($myHtml, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new \DOMXPath($doc);
$anchors = $xpath->query("//a[@title='something something']");
$list = $xpath->query("//ul[@class='some-class']")[0];
foreach ($anchors as $a) {
    $list->removeChild($a->parentNode);
}

var_dump($doc->saveHTML());

Essentially, I am trying to remove a list item that contains an anchor tag with a title of 'something something'. 本质上,我试图删除一个列表项,其中包含标题为“某事物”的锚标记。 However, when I save the html after applying the changes, the list moves inside the div tag. 但是,当我在应用更改后保存html时,列表会在div标记内移动。 Why would that occur? 为什么会这样? Thanks. 谢谢。

loadHTML() tries to correct syntaxis, and it doesn't like the ul element being parentless, so it moves it inside the div . loadHTML()尝试纠正语法,并且它不喜欢ul元素是无父对象的,所以它将它移到div If you wrap it all around a body tag, it'll work correctly. 如果将它全部包裹在body标签周围,它将正常工作。

loadHTML() actually automatically should do the wrapping for you were it necessary, but you set the LIBXML_HTML_NOIMPLIED flag, which disables this. loadHTML()实际上应该自动为你做包装,但是你设置了LIBXML_HTML_NOIMPLIED标志,这会禁用它。

<?php
$myHtml = '
<html>
<body>
<div class="div-class">
    <p>text</p>

    <p><a href="#">text</a></p>
</div>

<ul class="some-class">
    <li><a href="#" target="_blank" title="something something"><img src="" alt=""></a>
    </li>
    <li><a href="" target="_blank" title=""><img src="" alt=""></a>
    </li>
    <li><a href="" target="_blank" title=""><img src=""></a>
    </li>
</ul>
</body>
</html>
';

$doc = new \DOMDocument();
$doc->loadHTML($myHtml, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new \DOMXPath($doc);
$anchors = $xpath->query("//a[@title='something something']");
$list = $xpath->query("//ul[@class='some-class']")[0];
foreach ($anchors as $a) {
    $list->removeChild($a->parentNode);
}

var_dump($doc->saveHTML());

Demo 演示

Or, without the LIBXML_HTML_NOIMPLIED flag: 或者,没有LIBXML_HTML_NOIMPLIED标志:

<?php
$myHtml = '
<div class="div-class">
    <p>text</p>

    <p><a href="#">text</a></p>
</div>

<ul class="some-class">
    <li><a href="#" target="_blank" title="something something"><img src="" alt=""></a>
    </li>
    <li><a href="" target="_blank" title=""><img src="" alt=""></a>
    </li>
    <li><a href="" target="_blank" title=""><img src=""></a>
    </li>
</ul>
';

$doc = new \DOMDocument();
$doc->loadHTML($myHtml, LIBXML_HTML_NODEFDTD);
var_dump (libxml_get_errors());
$xpath = new \DOMXPath($doc);
$anchors = $xpath->query("//a[@title='something something']");
$list = $xpath->query("//ul[@class='some-class']")[0];
foreach ($anchors as $a) {
    $list->removeChild($a->parentNode);
}

var_dump($doc->saveHTML());

Demo 演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM