재귀 루프가 발생했습니다. 이렇게하면 진행 상황을 시각화하는 데 도움이됩니다. 나는 명확성을 위해 들여 쓰기를 추가 한 :
php > $html = '<!DOCTYPE html><html><head><title>Sample</title></head><body><img src="https://example.com/images/example.jpg"></body></html>';
php >
php > $doc = new DOMDocument();
php > $doc->loadHTML($html);
php >
php > $images = $doc->getElementsByTagName('img');
php >
php > $count=0;
php > foreach ($images as $image) {
php { $count++;
php { if($count>4) {
php { die('limit exceeded');
php { }
php {
php { $src = $image->getAttribute('src');
php { $noscript = $doc->createElement('noscript');
php {
php { //$node = $doc->createElement('div');
php { $node = $doc->createElement('img'); //If a uncomment this line the script just times out
php {
php { $node->setAttribute('src', $src);
php {
php { $noscript->appendChild($node);
php {
php { $image->setAttribute('x-data-src', $src);
php { $image->removeAttribute('src');
php { $image->parentNode->appendChild($noscript);
php { //$image->parentNode->appendChild($newImage);
php {
php { }
limit exceeded
php > $body = $doc->saveHTML();
php >
php > echo $body;
<!DOCTYPE html>
<html><head><title>Sample</title></head><body>
<img x-data-src="https://example.com/images/example.jpg">
<noscript>
<img x-data-src="https://example.com/images/example.jpg">
<noscript>
<img x-data-src="https://example.com/images/example.jpg">
<noscript>
<img x-data-src="https://example.com/images/example.jpg">
<noscript>
<img src="https://example.com/images/example.jpg">
</noscript>
</noscript>
</noscript>
</noscript>
</body></html>
php >
재귀를 일으키는 귀찮은 라인은 당신이 주석하는 경우, 재귀가 사라질
$image->parentNode->appendChild($noscript);
입니다. recurses 때, x-data-src가 마지막 것을 제외한 모든 것에 적용되고 있음을 주목하십시오.
나는이 동작을 일으키는 것이 무엇인지 알지 못했지만, 시각적으로 시각화 할 수 있으면 더 자세히 진단하는 데 도움이됩니다.
는 ** UPDATE
영업 이익이했다 그것으로 실행하고, 아래 그림과 같이 자신의 솔루션으로 해답을 완료했다.
문제는 getElementsByTagName
가 LiveNodeList
이 때문에 무한 재귀를 야기 할 문서에 이미지를 추가 반환 사실이었다.
은 내가 먼저
<?php
$html = '<!DOCTYPE html><html><head><title>Sample</title></head><body><img src="https://example.com/images/example.jpg"></body></html>';
$doc = new DOMDocument();
$doc->loadHTML($html);
$images = $doc->getElementsByTagName('img');
$normal_array = [];
foreach ($images as $image) {
$normal_array[] = $image;
}
// Now we have all tags in a simple array NOT in a Live Node List
foreach ($normal_array as $image) {
$src = $image->getAttribute('src');
$noscript = $doc->createElement('noscript');
$node = $doc->createElement('img'); //If a uncomment this line the script just times out
$node->setAttribute('src', $src);
$noscript->appendChild($node);
$image->setAttribute('x-data-src', $src);
$image->removeAttribute('src');
$image->parentNode->appendChild($noscript);
//$image->parentNode->appendChild($newImage);
}
$body = $doc->saveHTML();
AFAIK의 DIV 년대는'src' 속성이없는 간단한 배열에있는 모든 이미지 태그를 수집하여 그것을 해결. –
'getElementsByTagName'은 최소한 DOM 사양에 따라 _live_ NodeList를 반환합니다. PHP/DomDocuments 구현에도 해당된다면, 그 안의 요소 주위를 돌아 다니면서 이러한 NodeList를 반복하는 것이 좋은지 아닌지 잘 모르겠다. – CBroe
글쎄, 그건 div로만 작동한다는 것이다. img – Cesar