DOMDocument и удалить родительский тег

Мы загружаем html по URL. После этого создается DOMDocument

libxml_use_internal_errors(true); // disable errors
$oHtml = new DOMDocument();
if (!$oHtml->loadHTML($this->getHtml($aData['href']))) {
 return false;
}

Следующий шаг - удалить fancybox или другие ссылки popUp... В нашем случае код изображения

<a onclick="return hs.expand(this)" href="http://domain.com/uploads/09072014106.jpg">
 
</a>

И мы выполняем наш метод для него...

$this->clearPopUpLink($oHtml); // delete parent
<a tag....="" <="" code=""> <p>Метод...</p> </a> <pre class="prettyprint linenums"><a tag....="" <="" code=""><code>private function clearPopUpLink($oHtml) { $aLink = $oHtml->getElementsByTagName('a'); if (!$aLink->length) { return false; } for ($k = 0; $k < $aLink->length; $k++) { $oLink = $aLink->item($k); if (strpos($oLink->getAttribute('onclick'), 'return hs.expand(this)') !== false) { // // // $oImg = $oLink->firstChild; $oImg->setAttribute('src', $oLink->getAttribute('href')); // set img proper src // $oLink->parentNode->removeChild($oLink); // $oLink->parentNode->replaceChild($oImg, $oLink); $oLink->parentNode->insertBefore($oImg); // replacing!?!?!?! // echo $oHtml->ownerDocument->saveHtml($oImg); } } }

Теперь вопросы... Этот код работает, но я не получаю ПОЧЕМУ! Почему при выполнении clearPopUpLink() со всеми "изображениями" у него нет OLD-кода с тегами? Я попытался использовать (в первый раз при начале исследования) → insertBefore(), после чего → removeChild(). Сначала добавьте простое (отредактированное) изображение текущего изображения BEFOR (с ), после чего удалите старый node образ (с ). НО! Он не работает, он выполнял только каждую секунду (каждый из них был выполнен правильно).

Итак, позвольте мне задать простой вопрос, как это сделать правильно? Потому что я не думаю, что код ниже (clearPopUpLink) достаточно правильный... Пожалуйста, предложите свои решения.

1 ответ

Хм, я бы использовал для этого Trustey XPath и убедился, что привязка удалена; код, который вы показали, точно не делает это очевидным (я его не тестировал).

$xpath = new DOMXPath($doc);
foreach ($xpath->query('//a[contains(@onclick, "return hs.expand(this)")]/img') as $img) {
 $anchor = $img->parentNode;
 $anchor->parentNode->insertBefore($img, $anchor); // take image out
 $anchor->parentNode->removeChild($anchor); // remove empty anchor
}
echo $doc->saveHTML();

licensed under cc by-sa 3.0 with attribution.