3v4l.org

run code in 500+ PHP versions simultaneously
<?php $html = ' <!DOCTYPE html> <html lang="fr"> <head> <meta charset="UTF-8"> <title>tester fusion</title> <style> span {color:red} .refid-valeur {white-space:nowrap} .char-style-override-6 {color:navy} </style> </head> <body> <div> <span class="refid-valeur char-style-override-6">special</span><span class="refid-valeur char-style-override-6"> </span><span class="refid-valeur char-style-override-6">espace</span> </div> <span class="refid-valeur char-style-override-6">RCR-ART-RCR-L</span><span class="refid-valeur char-style-override-6">213</span><span class="refid-valeur char-style-override-6">-1</span> <div> <span class="refid-valeur char-style-override-6">séquence avec child</span><span class="refid-valeur char-style-override-6"> P<span>A</span>S</span><span class="refid-valeur char-style-override-6"> </span><span class="refid-valeur char-style-override-6"><em>D</em>E PRO</span><span class="refid-valeur char-style-override-6">BLÈME</span><span class="refid-valeur char-style-override-6"> <strong>ICI</strong>?</span> </div> </body> </html> '; $dom = new DOMDocument; $dom->loadHTML($html, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED); $xp = new DOMXPath($dom); $firstElts = $xp->query('//span' // un element span n'importe où dans l'arbre DOM . '[@class="refid-valeur char-style-override-6"]' // avec l'attribut class recherché // qui n'est pas immédiatement précédé par un élément avec les mêmes caractéristiques . '[not(preceding-sibling::node()[1][local-name()="span"][@class="refid-valeur char-style-override-6"])]' // mais dont le nœud qui le suit immédiatement est un élément avec les mêmes caractéristiques . '[following-sibling::node()[1][local-name()="span"][@class="refid-valeur char-style-override-6"]]'); function isSameElt($node1, $node2) { if ( $node1->nodeName !== $node2->nodeName ) return false; if ( $node1->attributes->length !== $node2->attributes->length ) return false; foreach ( $node1->attributes as $attr ) { if ( !$node2->hasAttribute($attr->name) || $node2->getAttribute($attr->name) !== $attr->value ) return false; } return true; } $toDelete = []; foreach ($firstElts as $firstElt) { $current = $firstElt; while ( null !== $current = $current->nextSibling ) { if ( !isSameElt($firstElt, $current) ) break; foreach ($current->childNodes as $childNode) { $firstElt->appendChild($childNode); } $toDelete[] = $current; } } foreach ($toDelete as $node) { $node->parentNode->removeChild($node); } echo $dom->saveHTML();
Output for 7.1.0 - 7.1.33, 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.34, 8.2.0 - 8.2.30, 8.3.0 - 8.3.30, 8.4.1 - 8.4.18, 8.5.0 - 8.5.3
<!DOCTYPE html> <html lang="fr"> <head> <meta charset="UTF-8"> <title>tester fusion</title> <style> span {color:red} .refid-valeur {white-space:nowrap} .char-style-override-6 {color:navy} </style> </head> <body> <div> <span class="refid-valeur char-style-override-6">special espace</span> </div> <span class="refid-valeur char-style-override-6">RCR-ART-RCR-L213-1</span> <div> <span class="refid-valeur char-style-override-6">s&eacute;quence avec child P <em>D</em>BL&Egrave;ME </span> </div> </body> </html>

preferences:
45.3 ms | 1716 KiB | 4 Q