Мне нужно добавить класс в структуру 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>
Я не мог найти более элегантный способ переназначить всех детей, поэтому я предполагаю, что это будет сделано. Тем не менее, я думаю, что он получает то, что вам нужно.
(ПРИМЕЧАНИЕ. Код обновлен, чтобы отразить дополнительные требования в комментариях.)
$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()
. В комментариях есть обходное решение , но это некрасиво. Надеемся, что некоторые из комментариев пользователя помогут вам найти полезное решение.