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">&lt;a tag....="" &lt;="" code=""&gt;&lt;code&gt;private function clearPopUpLink($oHtml) { $aLink = $oHtml-&gt;getElementsByTagName('a'); if (!$aLink-&gt;length) { return false; } for ($k = 0; $k &lt; $aLink-&gt;length; $k++) { $oLink = $aLink-&gt;item($k); if (strpos($oLink-&gt;getAttribute('onclick'), 'return hs.expand(this)') !== false) { // &lt;/code&gt;&lt;/a&gt;&lt;a onclick="return hs.expand(this)" href="http://domain.com/uploads/posts/2014-07/1405107411_09072014106.jpg"&gt; // // &lt;/a&gt; $oImg = $oLink-&gt;firstChild; $oImg-&gt;setAttribute('src', $oLink-&gt;getAttribute('href')); // set img proper src // $oLink-&gt;parentNode-&gt;removeChild($oLink); // $oLink-&gt;parentNode-&gt;replaceChild($oImg, $oLink); $oLink-&gt;parentNode-&gt;insertBefore($oImg); // replacing!?!?!?! // echo $oHtml-&gt;ownerDocument-&gt;saveHtml($oImg); } } }</pre> <p>Теперь вопросы... Этот код работает, но я не получаю ПОЧЕМУ! Почему при выполнении clearPopUpLink() со всеми "изображениями" у него нет OLD-кода с тегами? Я попытался использовать (в первый раз при начале исследования) → insertBefore(), после чего → removeChild(). Сначала добавьте простое (отредактированное) изображение текущего изображения BEFOR (с <a>), после чего удалите старый node образ (с </a><a>). НО! Он не работает, он выполнял только каждую секунду (каждый из них был выполнен правильно).</a></p><a> <p>Итак, позвольте мне задать простой вопрос, как это сделать правильно? Потому что я не думаю, что код ниже (clearPopUpLink) достаточно правильный... Пожалуйста, предложите свои решения.</p> </a>
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.