PHP Dom Удалить элемент оставить содержание

Я пытаюсь удалить определенные ссылки в зависимости от их тега ID, но оставьте содержимое ссылки. Например, я хочу

Some text goes <a href="http://www.domain.tdl/" id="remove">here</a> 

в

 Some text goes here 

Я пробовал использовать ниже.

 $dom = new DOMDocument; $dom->loadHtml(mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8")); $xp = new DOMXPath($dom); foreach($xp->query('//a[contains(@id="remove")]') as $oldNode) { $revised = strip_tags($oldNode); } $revised = mb_substr($dom->saveXML($xp->query('//body')->item(0)), 6, -7, "UTF-8"); echo $revised; 

грубо взятый отсюда, но он просто плюет обратно на то же содержимое $html .

Любая идея о том, как я это добьюсь?

Это моя функция:

 function DOMRemove(DOMNode $from) { $sibling = $from->firstChild; do { $next = $sibling->nextSibling; $from->parentNode->insertBefore($sibling, $from); } while ($sibling = $next); $from->parentNode->removeChild($from); } 

Итак, это:

 $dom->loadHTML('Hello <a href="foo"><span>World</span></a>'); $a = $dom->getElementsByTagName('a')->item(0); // get first DOMRemove($a); 

Должен дать вам:

 Hello <span>World</span> 

Чтобы получить узлы с определенным идентификатором, используйте XPath:

 $xpath = new DOMXpath($dom); $node = $xpath->query('//a[@id="something"]')->item(0); // get first DOMRemove($node); 

Подход, подобный ответу @ netcoder, но использующий другую структуру цикла и методы DOMElement.

 $html = '<html><body>This <a href="http://www.domain.tdl/" id="remove">link</a> was removed.</body></html>'; $dom = new DOMDocument(); $dom->loadHTML($html); $xpath = new DOMXPath($dom); foreach ($xpath->query('//a[@id="remove"]') as $link) { // Move all link tag content to its parent node just before it. while($link->hasChildNodes()) { $child = $link->removeChild($link->firstChild); $link->parentNode->insertBefore($child, $link); } // Remove the link tag. $link->parentNode->removeChild($link); } $html = $dom->saveXML(); 

Использование :

  //a[@id='remove']/node() | //*[a[@id='remove']]/node()[not(self::a[@id=''remove])] 

Это выбирает всех дочерних элементов любого id атрибута со значением "remove" и всех предыдущих и следующих братьев и сестер этого a , которые сами по себе не имеют другого id атрибута со значением "remove"