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....