как удалить одно изображение в строке через php dom

1

У меня есть строка с некоторым <img>.

$string = '  <img src="pic.jpg">  and <img src="pic2.jpg">';
    $doc = new DOMDocument('1.0', 'UTF-8');
        libxml_use_internal_errors(true);
        $doc->loadHTML(mb_convert_encoding($string, 'HTML-ENTITIES', 'UTF-8'));
        libxml_clear_errors();
        $imgs = $doc->getElementsByTagName('img');
        foreach ($imgs as $img) 
        {
            if($img->getAttribute('src') == 'pic.jpg')
            {
                // I want delete that picture form string
                $img->parentNode->removeChild($img);
            }
                else
                  $img->setAttribute('class', 'image normall');

        }
        $string = $doc->saveHTML();
        echo $string;

В конце функции, когда я печатаю $string, целевой pic был удалён, но для другого pic не добавляется никакого класса!

но если я удалю $img->parentNode->removeChild($img); , класс добавит! что я не так?

EDIT, пожалуйста, проверьте эту строку:

$string = '  <img src="pic.jpg">  and <img src="pic2.jpg">';
  • 0
    Я редактирую свой код .. пожалуйста, просто запустите этот код в php онлайн в сети .... Я не могу понять, что вы имеете в виду? какая часть? Я не хочу удалять что-либо еще ... для другого класса я хочу добавить только класс ...
  • 0
    Я хочу добавить класс ко всем рис. код работает. Но если выполняется это условие, if($img->getAttribute('src') == 'pic.jpg') .... код удаляет этот рисунок ... Но не if($img->getAttribute('src') == 'pic.jpg') добавить класс для другого изображения
Теги:
dom

2 ответа

1
Лучший ответ

Вы можете удалять узлы, если вы повторяете назад.

Просто измените

// Forward iteration
foreach ($imgs as $img) {

в

// Reverse iteration
for($i = $imgs->length; --$i >= 0;) {
     $img = $imgs->item($i);

Ссылка: http://php.net/manual/en/class.domnodelist.php#83390

  • 0
    Вы правы @Drakes и избили меня с этим 10 секунд. проголосовал +10. хороший
  • 0
    спасибо @Drakes ... более короткое решение
0

Окончательно я решил это с этим изменением.... надеюсь, помогите другим...

$string = '  <img src="pic.jpg">  and <img src="pic2.jpg">';
    $doc = new DOMDocument('1.0', 'UTF-8');
        libxml_use_internal_errors(true);
        $doc->loadHTML(mb_convert_encoding($string, 'HTML-ENTITIES', 'UTF-8'));
        libxml_clear_errors();
        $imgs = $doc->getElementsByTagName('img');
        $imgs1 = $imgs2 = array();
        foreach($imgs as $img) {
            if($img->getAttribute('src') == 'pic.jpg')
            {
                $imgs1[] = $img;
            }
            else
            $imgs2[] = $img;
        }
        foreach($imgs1 as $img) {
            $img->parentNode->removeChild($img);
        }
        foreach ($imgs2 as $img) 
        {

            $img->setAttribute('class', 'image normall');

        }
        $string = $doc->saveHTML();
        echo $string;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню