2012-01-22 4 views
0

채팅 중에 html로 dom 요소를 가지고 있는데, 제거하고 싶은 일부 html 요소가 포함되어 있지만 여전히 괜찮은 태그를 유지하고 있습니다.선택된 자식 노드를 제거하는 DOM

나는 자식 요소를 통해 모든 자식 요소를 반복하고

foreach ($node->getElementsByTagName('*') as $element) 
    if ($element->nodeName != 'br') 
     $node->removeChild($element); 

제거 할 필요가있는 사람들을 삭제하려고하지만 이것은 치명적인 오류가 발생 잡히지하지 않는 찾을 수 없음 오류 예외가 발생합니다. 이 문제를 어떻게 해결할 수 있습니까?

답변

2

사용하여 노드 제거하는 대신 다음

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

phew ... 매력처럼 작동합니다. 아무런 오류도 보이지 않고 –

+0

이 나를 위해 일하지 않아서 고맙습니다. –

2

getElementsByTagName('*') 모든 하위 요소,하지 아이 요소를 발견합니다. 따라서 제거하려는 $element 중 일부는 $node의 하위 항목이 아니므로 실패합니다.

귀하의 의도는 100 % 확신 할 수 없지만 가장 확실한 것은 즉각 명의 아동을 삭제하기를 원할 것입니다. 이 경우 다음을 수행하십시오.

$nodestoremove = array(); 
foreach ($node->childNodes as $n) { 
    if ($n->nodeType===XML_ELEMENT_NODE and $n->nodeName!=='br') { 
     $nodestoremove[] = $n; 
    } 
} 
foreach ($nodestoremove as $n) { 
    $node->removeChild($n); 
} 
unset($nodestoremove); // so nodes can be garbage-collected 

echo $node->C14N(); // xml fragment after removal 

삭제할 노드를 식별하고 삭제할 두 번째 패스는 두 가지입니다. 이는 childNodes이 활성 목록이므로 삭제할 때 전달을 순회 할 수 없기 때문입니다. (우리가 그것을 뒤로 반복 할 수는 있지만)

관련 문제