Я анализирую 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);
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++;
}
Других решений пока нет …