Вы близки ... Создайте фрагмент для детей:
$query = "//span[contains(concat(' ', normalize-space(@class), ' '), ' c ')]";
$oldnodes = $xpath->query($query);
foreach ($oldnodes as $node) {
$fragment = $doc->createDocumentFragment();
while($node->childNodes->length > 0) {
$fragment->appendChild($node->childNodes->item(0));
}
$node->parentNode->replaceChild($fragment, $node);
}
Так как каждая итерация удалит $node
, нет необходимости повторять (она будет динамически удалять ее изрезультирующий набор, так как он больше не действителен) ...
Это также будет обрабатывать случаи, когда внутри диапазона есть больше, чем просто текст:
<span class="a b c">foo <b>bar</b> baz</span>
Обратите внимание на недавнее редактирование: я изменилзапрос xpath будет более устойчивым, поскольку теперь он будет соответствовать только точным классам c
, а не toc
...
Что странно, так это то, что он позволяет удалять в итерации, не влияя на результаты (язнаю, что это было сделано раньше, я просто не знаю, почему здесь).Но это проверенный код, и он должен быть хорошим.