3v4l.org

run code in 300+ PHP versions simultaneously
<?php function isHTMLTextNode(DOMNode $node) { return $node instanceof DOMText || ($node instanceof DOMElement && strtolower($node->tagName) === 'br'); } function hasMultipleNonTextChildren(DOMElement $element) { $foundOne = false; foreach ($element->childNodes as $child) { if (!isHTMLTextNode($child)) { if ($foundOne) { return true; } $foundOne = true; } } return false; } function setStylesOnElement(DOMElement $element, array $css) { $styles = ltrim(rtrim($element->getAttribute('style'), ';') . '; ', ';'); foreach ($css as $prop => $val) { $styles .= $prop . ': ' . $val . '; '; } $element->setAttribute('style', trim($styles)); } function getCSSEquivs(DOMElement $element) { switch (strtolower($element->tagName)) { case 'font': $css = []; if ($element->hasAttribute('color')) { $css['color'] = $element->getAttribute('color'); } if ($element->hasAttribute('size')) { $css['font-size'] = $element->getAttribute('size') . 'px'; } if ($element->hasAttribute('face')) { $css['font-family'] = $element->getAttribute('face'); } return $css; case 'b': return ['font-weight' => 'bold']; case 'i': return ['font-style' => 'italic']; } return null; } function pullChildrenUp(DOMElement $element) { $children = []; $current = $element->firstChild; do { $next = $current->nextSibling; $children[] = $element->removeChild($current); } while ($current = $next); $parent = $element->parentNode; $before = $element->nextSibling; $parent->replaceChild(array_shift($children), $element); while ($children) { $parent->insertBefore(array_shift($children), $before); } } function pullChildrenDownIntoSpan($element, array $css = []) { $span = $element->ownerDocument->createElement('span'); $span->appendChild($element->replaceChild($span, $element->firstChild)); while ($span->nextSibling) { $span->appendChild($element->removeChild($span->nextSibling)); } return $span; } function stripFormattingTags(DOMText $textNode) { $css = []; $currentNode = $textNode->parentNode; while ($currentNode && !hasMultipleNonTextChildren($currentNode)) { if (null === $equivs = getCSSEquivs($currentNode)) { break; } $css = array_merge($equivs, $css); $parentNode = $currentNode->parentNode; pullChildrenUp($currentNode); $currentNode = $parentNode; } if ($currentNode->tagName !== 'span') { $currentNode = pullChildrenDownIntoSpan($currentNode); } if ($css) { setStylesOnElement($currentNode, $css); } } $html = '<FONT FACE="League" SIZE="15" COLOR="#000000"><font COLOR="#ff00ff" SIZE="18"><b><font SIZE="23"><font SIZE="27"><font SIZE="23"><font SIZE="18"><font SIZE="23">Moet Flip make-up dragen? <br />Stem mee in de poll!!</font></font></font></font></font></b></font><br /></FONT>'; $dom = new DOMDOcument(); $dom->loadHTML($html); $xpath = new DOMXPath($dom); $nodes = $xpath->evaluate("/html/body//text()"); foreach ($nodes as $node) { stripFormattingTags($node); } var_dump($dom->saveHTML());

preferences:
34.34 ms | 402 KiB | 5 Q