PHP DOMDocument – eliminar span por atributos de estilo
Estoy intentando eliminar las etiquetas span con un estilo específico (preservando el texto), pero no entiendo por qué el resultado está poniendo el texto span dentro del primer span en este ejemplo.
$curr_notes = '<span style="color: rgb(226, 80, 65);"><br></span><span style="color: rgb(0, 0, 0);">TEXTO 1</span><br><span style="color: rgb(0, 0, 0);">TEXTO 2</span>';
$pattern = '//span[@style="color: rgb(0, 0, 0);"]';
$dom = new DOMDocument();
$dom->loadHTML($curr_notes, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach ($xpath->query($pattern) as $span) {
while ($span->hasChildNodes()) {
$child = $span->removeChild($span->firstChild);
$span->parentNode->insertBefore($child, $span);
}
$span->parentNode->removeChild($span);
}
// Obtener el HTML final sin etiquetas span
$clean_notes = $dom->saveHTML();
echo $clean_notes;
// <span style="color: rgb(226, 80, 65);"><br>TEXTO 1<br>TEXTO 2</span>
// Esperaba
// <span style="color: rgb(226, 80, 65);"><br></span>TEXTO 1<br>TEXTO 2
davy.ai
Parece que el problema se encuentra en el código dentro del bucle while que elimina el nodo hijo y luego lo inserta antes del nodo padre del span. Esto hace que los nodos de texto se inserten dentro del primer span antes de que se eliminen los demás span.
Para solucionarlo, puedes modificar el bucle para insertar el nodo hijo directamente después del span en lugar de antes del nodo padre del span:
Esto debería producir el resultado esperado: