2016-08-17 3 views
1

У меня есть этот HTML в моей базе данных:Как удалить определенный элемент DOM с PHP DOMDocument

<p>some text 1</p> 
<img src=\"http://www.example.com/images/some_image_1.jpg\"> 
<p>some text 2</p> 
<p>some text 3</p> 
<img src=\"http://www.example.com/images/some_image_2.jpg\"> 
<p>some text 4</p> 
<p>some text 5</p> 
<img src=\"http://www.example.com/images/some_image_3.jpg\"> 

Условно, мне нужно, чтобы удалить некоторые конкретные <img> тег. Поэтому я не хочу удалять все теги <img>, но только конкретные.

Я попытался это, но он будет удалять все <img> тегов, даже если я не хочу, чтобы:

$dom = new \DOMDocument; 
$dom->preserveWhiteSpace = false; 
$dom->loadHTML($html); 

$nodes = $dom->getElementsByTagName("img"); 

for($i = 0; $i < $nodes->length; $i++) { 
    if ($i == 1) { 
     continue; 
    } 
    $image = $nodes->item($i); 
    $image->parentNode->removeChild($image); 
} 

return $dom->saveHTML(); 

Может кто-нибудь помочь мне с этим? В этом примере html скажем, что я хочу удалить первое и третье изображение в тексте, но оставить второй.

Кроме того, я заметил, что метод saveHTML() добавляет теги <html><body> к моему html, и я не хочу этого. Я не вижу возможности отключить это. Любая помощь там тоже?

Заранее спасибо, я застрял с этим в течение нескольких часов.

ответ

1

Вы можете сделать это, используя массив. Я изменил ваш код, это не удалит второй тег img.

$dom = new \DOMDocument; 
$dom->preserveWhiteSpace = false; 
$dom->loadHTML($html); 

// Declare array with numeric vlaues 
$remainImages = array(1); 

$nodes = $dom->getElementsByTagName("img"); 

    for($i = 0; $i < $nodes->length; $i++) { 
    if (!in_array($i,$remainImages) { 
     $image = $nodes->item($i); 
     $image->parentNode->removeChild($image); 
    } 
} 

return $dom->saveHTML(); 
+0

По какой-либо причине ваш код сохранит второе и третье изображение. Я нашел способ заставить его работать. Внутри цикла for я создаю массив удаляемых изображений. Затем в дополнительном цикле foreach я просматриваю этот массив и удаляю изображения. – offline

+0

Да, второе изображение будет оставаться выше в коде, но не третьим. Поэтому вам нужно убедиться, что 2 не добавлен в этот массив. '$ stillImages = array (1);' –

+0

Он не работает должным образом. Посмотрите здесь: http://phpfiddle.org/main/code/rkim-st8w, запустите код. – offline

1

есть возможность избежать добавления HTML и тела тега, если вы хотите, чтобы загрузить HTML-файл или содержание:

$dom = new DOMDocument; 
$dom->preserveWhiteSpace = false; 
@$dom->loadHTML(file_get_contents('file.html'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 
//@$dom->loadHTMLFile('file.html'); //Adds Html and body tags if not exist at the beginning 

$nodes = $dom->getElementsByTagName("img"); 

foreach($nodes as $i => $node){ 
    if ($i == 1) { 
     continue; 
    } 
    $image = $nodes->item($i); 
    $image->parentNode->removeChild($image); 
} 

return $dom->saveHTML(); 
//$dom->saveHtmlFile('file.html'); 

некоторых ответов близко к ответу на ваш вопрос, который используется в этом ответе:

  1. Для удаления элемента (вы уже использовали): https://stackoverflow.com/a/15272752/3086860
  2. Чтобы избежать ввода дополнительных тегов : https://stackoverflow.com/a/22490902/3086860

 Смежные вопросы

  • Нет связанных вопросов^_^