Я пытаюсь удалить определенные ссылки в зависимости от их тега 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"