2017-02-21 9 views
1

У меня есть следующая проблема. Когда HTML начинается с <img> тега, и я сохраняю $dom->saveHTML() Я получаю только первое изображение в качестве ответа. Но когда я добавляю любую строку перед тегом <img>, я получаю дополнительный <p></p> тег для HTML. Почему это?php domDocument() saveHTML сохранить только первое изображение, когда HTML начинается с <img>

$h = '<img src="https://example.com/one.jpg" alt=""><br><p>bla</p><img src="https://example.com/foo.jpg" alt=""><br>'; 

$h = 'abc<img src="https://example.com/one.jpg" alt=""><br><p>bla</p><img src="https://example.com/foo.jpg" alt=""><br>'; 

Выше приведены примеры входов

<?php 

$h = '<img src="https://example.com/one.jpg" alt=""><br><p>bla</p><img src="https://example.com/foo.jpg" alt=""><br>'; 

    echo'start<br />'; 
    echo htmlspecialchars($h); 
    echo'<br />end<br />'; 

    $dom = new domDocument(); 
    $dom->loadHTML($h, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 
    $dom->preserveWhiteSpace = false; 
    $images = $dom->getElementsByTagName('img'); 
    foreach ($images as $image) { 
     $img_class = $image->getAttribute('class'); 

     if($img_class == '') { 
      $image->setAttribute('class', 'img-responsive img-rounded'); 
      echo'add class <br />'; 
     } 
    } 

    $my_post_content = $dom->saveHTML(); 

    echo'start<br />'; 
    echo htmlspecialchars($my_post_content); 
    echo'<br />end<br />'; 

ответ

0

Привет друг я сделал некоторые тесты вашего сценария, и кажется, что второе изображение исчезает из-за LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD чем перейти к $dom->loadHTML($h, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

Там может быть простым решением сделать это «взломать» и использовать что-то вроде этого:

$h = 'abc<img src="https://example.com/one.jpg" alt=""><br><p>bla</p><img src="https://example.com/foo.jpg" alt=""><br>';

Тогда просто вручную вырезать необходимые вещи из строки, но я дам вам лучшее решение:

$h = '<img src="https://example.com/one.jpg" alt=""><br><p>bla</p><img src="https://example.com/foo.jpg" alt=""><br>'; 

echo'start<br />'; 
echo htmlspecialchars($h); 
echo'<br />end<br />'; 

// blank document is used because we want to extract only the 
// html inside <body> from $dom 
$blank = new DOMDocument; 

// initialize the $dom object and nothing is changed in this code 
$dom = new domDocument(); 
$dom->loadHTML($h); 
$dom->preserveWhiteSpace = false; 
$images = $dom->getElementsByTagName('img'); 
foreach ($images as $image) { 
    $img_class = $image->getAttribute('class'); 

    if ($img_class == '') { 
     $image->setAttribute('class', 'img-responsive img-rounded'); 
     echo'add class <br />'; 
    } 
} 

// now get the body that will containg updated HTML 
// and insert all it's children in the blank document 
$body = $dom->getElementsByTagName('body')->item(0); 
foreach ($body->childNodes as $child) { 
    $blank->appendChild($blank->importNode($child, true)); 
} 

$my_post_content = $blank->saveHTML($blank); 

echo'start<br />'; 
echo htmlspecialchars($my_post_content); 
echo'<br />end<br />'; 
exit; 

и выход будет:

start 
<img src="https://example.com/one.jpg" alt=""><br><p>bla</p><img src="https://example.com/foo.jpg" alt=""><br> 
end 
add class 
add class 
start 
<img src="https://example.com/one.jpg" alt="" class="img-responsive img-rounded"><br><p>bla</p><img src="https://example.com/foo.jpg" alt="" class="img-responsive img-rounded"><br> 
end 

, как вы видите, у вас есть вы оба изображения ,

Cheers!