2013-03-07 17 views
26

Czy można usunąć element z załadowanego DOM bez tworzenia nowego? Na przykład coś takiego:Jak usunąć element za pomocą DOMDocument?

$dom = new DOMDocument('1.0', 'utf-8'); 
$dom->loadHTML($html); 

foreach($dom->getElementsByTagName('a') as $href) 
    if($href->nodeValue == 'First') 
     //delete 
+0

możliwe duplikat [PHP: nie można usunąć węzeł z domDocument] (http://stackoverflow.com/questions/3602207/php-cant-remove-node-from-domdocument) – hakre

Odpowiedz

72

usunąć węzeł mówiąc węzeł nadrzędny, aby usunąć dziecko:

$href->parentNode->removeChild($href); 

Zobacz DOMNode::$parentNodeDocs i DOMNode::removeChild()Docs.

Zobacz także:

+2

Hehe :) daliśmy prawie w tej samej sekundzie * tę samą * odpowiedź. – hek2mgl

+2

Tak, nie ma wielu opcji, jak to zrobić. Dodałem teraz kilka linków, aby była to prawdziwa odpowiedź, ale to pachnie jak duplikat kandydata. Przynajmniej jedno powinno wybrać dobre, powiązane pytanie. – hakre

15

prościej:

$href->parentNode->removeChild($href); 
+0

(zduplikowane) dokładnie tak samo jak użytkownik hakre ... –

+2

@PeterKrauss Odpowiedzieliśmy dokładnie w tym samym czasie, dziwne, że nie dostałem żadnych upvotes =/ – silkfire

+1

Tak, przepraszam (!) ... teraz widzę czas . Chcesz usunąć mój komentarz? –

7

Zajęło mi trochę czasu, aby dowiedzieć się, więc oto kilka wyjaśnień:

Jeśli usuwasz elementy z wewnątrz pętli (jak na przykład OP), trzeba pętli wstecz

$elements = $completePage->getElementsByTagName('a'); 
for ($i = $elements->length; --$i >= 0;) { 
    $href = $elements->item($i); 
    $href->parentNode->removeChild($href); 
} 

DOMNodeList documentation: można modyfikować, a nawet usuwać węzły z DOMNodeList jeśli iteracji wstecznej

Powiązane problemy