es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , ,

Answer

  1. Avatar for 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:

    foreach ($xpath->query($pattern) as $span) {
        while ($span->hasChildNodes()) {
            $child = $span->removeChild($span->firstChild);
            $span->parentNode->insertBefore($child, $span->nextSibling);
        }
        $span->parentNode->removeChild($span);
    }
    

    Esto debería producir el resultado esperado:

    <span style="color: rgb(226, 80, 65);"><br></span>TEXTO 1<br>TEXTO 2
    

Comments are closed.