iframe — PHP DOMDocument parentNode- & gt; replaceChild, заставляющий foreach пропускать следующий элемент

Я анализирую HTML в $content переменная с DOMDocument, чтобы заменить все iframes с изображениями. Foreach заменяет только фреймы ODD. Я удалил весь код в foreach и нашел фрагмент кода, вызывающий это: ‘$ iframe-> parentNode-> replaceChild ($ link, $ iframe);’

Почему бы foreach пропустить все нечетные iframe?

Код:

        $count = 1;
$dom = new DOMDocument;
$dom->loadHTML($content);
$iframes = $dom->getElementsByTagName('iframe');
foreach ($iframes as $iframe) {

$src = $iframe->getAttribute('src');
$width = $iframe->getAttribute('width');
$height = $iframe->getAttribute('height');

$link = $dom->createElement('img');
$link->setAttribute('class', 'iframe-'.self::return_video_type($iframe->getAttribute('src')).' iframe-'.$count.' iframe-ondemand-placeholderImg');
$link->setAttribute('src', $placeholder_image);
$link->setAttribute('height', $height);
$link->setAttribute('width', $width);
$link->setAttribute('data-iframe-src', $src);

$iframe->parentNode->replaceChild($link, $iframe);

echo "here:".$count;
$count++;
}

$content = $dom->saveHTML();

return $content;

Это проблема строки кода

        $iframe->parentNode->replaceChild($link, $iframe);

1

Решение

DOMNodeList, такой как тот, который вернулся из getElementsByTagName, является «жить»:

то есть изменения в базовой структуре документа отражаются во всех соответствующих объектах NodeList …

Поэтому, когда вы удаляете элемент (в данном случае, заменяя его другим), он больше не существует в списке узлов, а следующий в строке занимает свою позицию в индексе. Тогда, когда foreach попадает на следующую итерацию и, следовательно, на следующий индекс, один будет эффективно пропущен.

Не удаляйте элементы из DOM через foreach как это.


Подход, который работает вместо этого, будет использовать while цикл, чтобы повторить и заменить, пока ваш $iframes список узлов пуст.

Пример:

while ($iframes->length) {
$iframe = $iframes->item(0);

$src = $iframe->getAttribute('src');
$width = $iframe->getAttribute('width');
$height = $iframe->getAttribute('height');

$link = $dom->createElement('img');
$link->setAttribute('class', 'iframe-'.self::return_video_type($iframe->getAttribute('src')).' iframe-'.$count.' iframe-ondemand-placeholderImg');
$link->setAttribute('src', $placeholder_image);
$link->setAttribute('height', $height);
$link->setAttribute('width', $width);
$link->setAttribute('data-iframe-src', $src);

$iframe->parentNode->replaceChild($link, $iframe);

echo "here:".$count;
$count++;
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]