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

标签 php html string domparser

这是我的代码:

$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());

本质上,我试图删除一个列表项,该列表项包含一个标题为“something something”的 anchor 标记。但是,当我在应用更改后保存 html 时,列表会移动到 div 标记内。为什么会这样?谢谢。

最佳答案

loadHTML()尝试更正语法,并且它不喜欢 ul 元素没有父元素,因此它将它移到 div 中。如果将其全部包裹在 body 标记周围,它将正常工作。

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

或者,没有 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

关于PHP DOM 解析器移动关闭 Div 标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48796848/

相关文章:

php - 警告 : ftp_get function

javascript - AngularJS 从 PHP 文件获取数据

php - 电子邮件重新输入警报jquery

java - 将字符串分割为前两个空格

php - PHP 中的 LXML 库?

javascript - 试图让我的照片幻灯片不断循环播放所有照片

html - 将 <div> 放在另一个 <div> CSS 上

HTML5 track subtitles and property cue and ActiveCue 在 IE (internet explorer) 中为空

python - 如何通过删除python中的重复项进行压缩?

java - Java 中使用 nextLine() 获取名称长度