PHP DOM Parser Moving Closing Div Tag
here is 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'm trying to remove a list item that contains an anchor tag with the heading "something." However, when I save the html after applying the changes, the list moves inside the div tag. Why is this going to happen? Thank.
loadHTML()tries to fix the syntax, and he doesn’t like that the element is ulnot a parent, so he moves it inside div. If you wrap it around a tag body, it will work correctly.
loadHTML()actually should automatically do a wrapper for you if necessary, but you have set a flag LIBXML_HTML_NOIMPLIEDthat disables it.
<?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());
Or, without a 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());