2016-07-14 6 views
1

こんにちは、私はすべてのiframeとのimgタグを置き換えるために、このメソッドを使用していPHPのDOMDocumentも、要素spanタグと

$string = clean($string); 
    $dom = new \DOMDocument; 
    $dom->loadHTML(mb_convert_encoding($string, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 
    $iframes = $dom->getElementsByTagName('iframe'); 

    foreach($iframes as $iframe) { 
     $src = $iframe->getAttribute('src'); 
     $span = $dom->createElement('span'); 
     $span->setAttribute('title', $src); 
     $span->setAttribute('class', 'lazy-youtube'); 
     $iframe->parentNode->replaceChild($span, $iframe); 
    } 

    $images = $dom->getElementsByTagName('img'); 

    foreach($images as $image) { 
     $src = $image->getAttribute('src'); 
     $span = $dom->createElement('span'); 
     $span->setAttribute('title', $src); 
     $span->setAttribute('class', 'lazy-image'); 
     $image->parentNode->replaceChild($span, $image); 
    } 

    $html = $dom->saveHTML(); 

    return clean($html); 

をスキップしますが、問題は、それがこの

// Iframe 
<span> 
<iframe> 
<span> 
<iframe> 
<span> 
<iframe> 
<span> 
<iframe> 

// Img 
<span> 
<img> 
<span> 
<img> 
<span> 
<img> 
<span> 
<img> 

のように常にだ要素をスキップしていることですiframe用のHTML

<div class="content"> 
<p> 
    <iframe frameborder="0" height="315" src="https://www.youtube.com/embed/T6kG5vuPVSs?rel=0" width="560"></iframe> 
<p> 
</p> 
    <iframe frameborder="0" height="315" src="https://www.youtube.com/embed/GjnadPBMJGs?rel=0" width="560"></iframe> 
<p> 
</p> 
    <iframe frameborder="0" height="315" src="https://www.youtube.com/embed/KYm8SLLQ0kk?rel=0" width="560"></iframe> 
<p> 
</p> 
    <iframe frameborder="0" height="315" src="https://www.youtube.com/embed/xUVz4nRmxn4?rel=0" width="560"></iframe> 
<p> 
</p> 
    <iframe frameborder="0" height="315" src="https://www.youtube.com/embed/hmZ6ziQJByY?rel=0" width="560"></iframe> 
</p> 
</div> 

すべての同じタイプの要素は同じ属性を持ち、srcだけが異なります。誰もがすべての要素を置き換えるためにそれを修正する方法を知っていますか?問題の

+0

おそらくあなたが要素を置き換えると、配列/オブジェクトが変化し、残りを1つの場所に移動し、次のものをスキップします。だからこそ私はスキップしていると思う。 – FirstOne

+0

@FirstOneとこれをどのように修正できますか? – allyfai

+0

@FirstOne Imこのメソッドを使用してデータベースにhtmlを保存すると効率的ではありません。いつもうまくいかず、レンダリングに時間がかかりますか? – allyfai

答えて

1

説明:あなたはインラインフレームを削除し、一度ので、それはおそらく、他のすべての要素をスキップしています、例えば、オブジェクト(要素のリスト)は、他の全てのアイフレームをの削除スポットをocuppyに移行する方法に変更します。

一つの方法に修正それ:

// code 
$iframes = $dom->getElementsByTagName('iframe'); 
while($iframes->length > 0){ // while there are still frames left to change 
    foreach($iframes as $iframe) { 
     // your regular code to replace iframe with span 
     // break; // this makes it easier to understand, but not really necessary 
    } 
    $iframes = $dom->getElementsByTagName('iframe'); // get the (remaining) skipped frames until there is none left 
} 
// code 

は画像と同じことを行うことを忘れないでください。ここで



問題を理解するためのより良い方法です:

 
1 - List of iframes 
iframe1 iframe2 iframe3 iframe4 iframe5 [...] 
    /\ - current item in loop 

2 - Replacing iframe1, it comes out of the list (since I just want iframes), so the list is now: 
iframe2 iframe3 iframe4 iframe5 [...] 
    /\ 

3 - Loop continues and it goes to the next item 
iframe2 iframe3 iframe4 iframe5 [...] 
      /\ - current item in loop 

は、それが他のすべての要素をスキップするだろうか、そのように、参照してください?

+0

代わりにDOMNodeList項目を取得した場合、残りのスキップされたフレームを取得する必要はありません。下の私の答えをチェックしてください。 –

0

これは、foreachが反復オブジェクトのコピーを作成せず、子を置き換えるときにDOMNodeList要素が変更されるためです。 のDOMNodeListを反復する正しい方法は次のとおりです。あなたが新しいものに古いノードから子要素を移動する必要がある場合

$elements = $domElement->getElementsByTagName("iframe"); 
while($elements->length > 0) { 
    $oldNode = $elements->item(0); 
    $newNode = $dom->createElement("image"); 
    $oldNode->parentNode->replaceChild($oldNode, $newNode); 
} 

は、同じロジックを使用して、あなたはこれを行うことができます。

while($oldNode->childNodes->length > 0) 
    $newNode->appendChild($oldNode->childNodes->item(0)); 
関連する問題