2017-05-23 1 views
1

phD DomDocument를 사용하여 이미지 요소를 noscript 요소에 추가하려고하면 이상한 문제가 발생합니다.php domdocument를 사용하여 img 요소를 추가 할 수 없습니다.

새 div 노드를 만들면 문제없이 noscript 요소에 추가 할 수 있지만 이미지 요소를 추가하려고하면 스크립트가 시간 초과됩니다.

내가 뭘 잘못하고 있니?

<?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'); 

foreach ($images as $image) { 
    $src = $image->getAttribute('src'); 
    $noscript = $doc->createElement('noscript'); 

    $node = $doc->createElement('div'); 
    //$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(); 

echo $body; 
+0

AFAIK의 DIV 년대는'src' 속성이없는 간단한 배열에있는 모든 이미지 태그를 수집하여 그것을 해결. –

+1

'getElementsByTagName'은 최소한 DOM 사양에 따라 _live_ NodeList를 반환합니다. PHP/DomDocuments 구현에도 해당된다면, 그 안의 요소 주위를 돌아 다니면서 이러한 NodeList를 반복하는 것이 좋은지 아닌지 잘 모르겠다. – CBroe

+1

글쎄, 그건 div로만 작동한다는 것이다. img – Cesar

답변

0

재귀 루프가 발생했습니다. 이렇게하면 진행 상황을 시각화하는 데 도움이됩니다. 나는 명확성을 위해 들여 쓰기를 추가 한 :

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

영업 이익이했다 그것으로 실행하고, 아래 그림과 같이 자신의 솔루션으로 해답을 완료했다.


문제는 getElementsByTagNameLiveNodeList이 때문에 무한 재귀를 야기 할 문서에 이미지를 추가 반환 사실이었다.

은 내가 먼저

<?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(); 
+0

모든'php>는 무엇입니까? –

+0

대화식 모드. 'php -a'를 사용하여 터미널에서 실행할 수 있습니다 –

+0

누군가 일어나고있는 일을 설명하기 위해 시간을내어 투표 해 보셨습니까? 나는 모든 것을 주석에 넣을 수있는 것과는 다르다. 때로는 대답이 초점을 재조정하여 발견됩니다. –