我需要在HTML结构中添加一个类。
我的班级名为“容器”,应该在< div>< ul>< li>< / h4> 之后开始了ul和它的simblings,而不是孙子)并且应该在关闭相同元素之前结束。
我的整个代码如下所示:
<?php
$content = '
<div class="sidebar-1">
<ul>
<li>
<h4>Title</h4>
<ul>
<li><a href="http://www.test.com">Test</a></li>
<li><a href="http://www.test.com">Test</a></li>
</ul>
</li>
<li>
<p>Paragraf</p>
</li>
<li>
<h4>New title</h4>
<ul>
<li>Some text</li>
<li>Some text åäö</li>
</ul>
</li>
</ul>
</div>
';
$doc = new DOMDocument();
$doc->loadHTML($content);
$x = new DOMXPath($doc);
$start_text = '<div class="container">';
$end_text = '</div>';
foreach($x->query('//div/ul/li') as $anchor)
{
$anchor->insertBefore(new DOMText($start_text),$anchor->firstChild);
}
echo $doc->saveXML($doc->getElementsByTagName('ul')->item(0));
?>
尽管我可以添加类开放但不是关闭元素。这样做我也得到奇怪的编码。我希望输出与输入的编码相同。
结果应为
<div class="sidebar-1">
<ul>
<li>
<h4>Title</h4>
<div class="content">
<ul>
<li><a href="http://www.test.com">Test</a></li>
<li><a href="http://www.test.com">Test</a></li>
</ul>
</div>
</li>
<li>
<div class="content">
<p>Paragraf</p>
</div>
</li>
<li>
<h4>New title</h4>
<div class="content">
<ul>
<li>Some text</li>
<li>Some text åäö</li>
</ul>
</div>
</li>
</ul>
</div>
答案 0 :(得分:2)
我找不到更优雅的方式来重新分配所有孩子,所以我想这会做。不过,我认为它会得到你想要的东西。
(注意:代码已更新,以反映评论中的其他要求。)
$doc = new DOMDocument();
$doc->loadHTML($content);
$x = new DOMXPath($doc);
foreach($x->query('//div/ul/li') as $anchor)
{
$container = $doc->importNode(new DOMElement('div'));
$container->setAttribute('class', 'container');
$next = $anchor->firstChild;
while ($next !== NULL) {
$curr = $next;
$next = $curr->nextSibling;
if (($curr->nodeName != 'h4')
|| ($curr->attributes === NULL)
|| ($curr->attributes->getNamedItem('class') === NULL)
|| !preg_match('#(^| )title( |$)#', $curr->attributes->getNamedItem('class')->nodeValue)
) {
$container->appendChild($anchor->removeChild($curr));
}
}
$anchor->appendChild($container);
}
至于字符编码,我已经搞砸了一段时间,这是一个棘手的问题。使用loadXML()
但不使用loadHTML()
加载时,字符会正确显示。有a workaround in the comments,但它并不漂亮。希望一些用户评论可以帮助您找到可用的解决方案。