Нет никакого автономного правильного ответа на этот вопрос. Это зависит от требований Вашего приложения, предпочтений и навыков Ваших разработчиков и фазы луны.
Попробуйте удалить промежутки непосредственно из дерева DOM.
$dom = new DOMDocument();
$dom->loadHTML($string);
$dom->preserveWhiteSpace = false;
$elements = $dom->getElementsByTagName('span');
while($span = $elements->item(0)) {
$span->parentNode->removeChild($span);
}
echo $dom->saveHTML();
@ile - У меня была эта проблема - это потому, что индекс итератора foreach счастливо продолжает увеличиваться, в то время как вызов removeChild () в DOM, похоже, также удаляет узлы из DomNodeList ( $ пролеты). Таким образом, для каждого удаляемого промежутка nodelist сжимает один элемент, а затем увеличивает его счетчик foreach на единицу. Общий результат: пропускается один диапазон.
Я уверен, что есть более элегантный способ, но я сделал это так - я переместил ссылки из DomNodeList во второй массив, где они не будут удалены Операция removeChild ().
foreach($spans as $span) {
$nodes[] = $span;
}
foreach($nodes as $span) {
$span->parentNode->removeChild($span);
}