public function replaceWholeText($text) { /** @var \FluentDOM\Text|\FluentDOM\CdataSection $this */ $text = (string) $text; $canReplaceEntity = function (\DOMEntityReference $reference) use(&$canReplaceEntity) { if ($reference->firstChild instanceof \DOMEntity && $reference->firstChild->hasChildNodes()) { foreach ($reference->firstChild->childNodes as $childNode) { $canReplace = FALSE; if ($childNode instanceof \DOMEntityReference) { $canReplace = $canReplaceEntity($childNode); } elseif ($childNode instanceof \DOMCharacterData) { $canReplace = TRUE; } if (!$canReplace) { return FALSE; } } return TRUE; } else { return FALSE; } }; $replaceNode = function (\DOMNode $node = NULL) use($canReplaceEntity) { if ($node instanceof \DOMElement || $node instanceof \DOMComment || $node instanceof \DOMProcessingInstruction) { return FALSE; } elseif ($node instanceof \DOMNode && $node->parentNode instanceof \DOMNode) { if ($node instanceof \DOMEntityReference && !$canReplaceEntity($node)) { throw new \DOMException(LIBXML_NO_MODIFICATION_ALLOWED_ERR); } $node->parentNode->removeChild($node); return TRUE; } return FALSE; }; do { $previous = $this->previousSibling; } while ($replaceNode($previous)); do { $next = $this->nextSibling; } while ($replaceNode($next)); if ($text === '') { if ($this->parentNode instanceof \DOMNode) { $this->parentNode->removeChild($this); } $this->textContent = ''; return NULL; } else { $this->textContent = $text; return $this; } }