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.

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

3 ответа

Что моя функция для этого:

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 = 'This <a href="http://www.domain.tdl/" id="remove">link</a> was removed.';
$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])]

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

licensed under cc by-sa 3.0 with attribution.