У меня есть пост ранее относительно удаления тегов html с пустым текстовым узлом.
$dom = new DOMDocument(); $dom->loadHtml( '<p><strong><a href="http://xx.org.uk/dartmoor-arts">test</a></strong></p> <p><strong><a href="http://xx.org.uk/depw"></a></strong></p> <p><strong><a href="http://xx.org.uk/devon-guild-of-craftsmen"></a></strong></p> <p>this line has a <br/>break</p> ' ); $xpath = new DOMXPath($dom); while(($nodeList = $xpath->query('//*[not(text()) and not(node())]')) && $nodeList->length > 0) { foreach ($nodeList as $node) { $node->parentNode->removeChild($node); } } echo $dom->saveHtml();
работает отлично, но я не хочу, чтобы он удалял тег <br/> - как его сохранить?
<br/>
Используйте этот XPath (исключая br узлы):
br
//*[not(text() or node() or self::br)]
Просто протестируйте $node перед удалением, например:
$node
if (!in_array($node->nodeName, array('br'))) { // add further nodes to keep $node->parentNode->removeChild($node); }
Попробуйте заменить теги <br/> на что-то вроде [br/], а затем восстановите их после.
[br/]
Достаточно легкий трюк:)