he batallado... pero ya encontre una solucion, para ambos...
   Código PHP:
    <?php
        
        //
        // el problema radica al resaltar palabras
        // entre el HTML, cierto... aqui vamos!
        
        
        global $single;
        $single = -1; // llave
        
        global $html;
        $html = array(); // declaramos un arreglo
        
        function marcador($test)
        {
            global $single, $html;
            $html[$single++] = "<{$test[1]}>"; // salvamos
            
            return '<!--/'.$single.'/-->'; // parece broma?
        }
        
        
        
        // pruebas..
        $texto = 'Este es un <span style="color: red">dummy</span>
                espartano que no va al spa, le dijo a Dyle...
        <div>Byle no quizo dividir la pasta</div>.'; // muestra de HTML
        
        
        //
        // la idea esta en esquivar el HTML, entonces
        // lo escapamos primero... y luego resaltamos
        //
        
        $texto2 = preg_replace_callback('/<([^>]+\/?)>/is', 'marcador', $texto);
        
        
        //
        // siendo honestos esta es una funcion que yo
        // tambien necesitaba, pero bueno... asi pasa
        
        
        function resaltar($texto, $que, $marca = '<b>\\1</b>')
        {
            $que = explode(' ', $que); // separamos
            $varias = array(); // expresion regular...
            foreach ($que as $palabra)
            {
                $palabra = strip_tags($palabra); // cero HTML!
                $varias[] = preg_quote($palabra); // escapamos
            }
            
            $todas = join('|', $varias); // unimos |
            $texto = preg_replace("/($todas)/is", $marca, $texto); // magia!
            
            return $texto;
        }
        
        
        // probamos?
        $texto2 = resaltar($texto2, 'le buscabamos un spa para refrescarnos mientras tomabamos con my sty que iba de low por div');
        
        //
        // restauramos las marcas...
        $texto2 = preg_replace('/<!--\/([0-9]+)\/-->/es', '$html[\\1 -1]', $texto2);
        
        
        print $texto2; // fiuh!!
        
        // -------- solo esta integrar todo esto en una
        // sola funcion.... no?
?>    
  :) simplificando....