Ver Mensaje Individual
  #2 (permalink)  
Antiguo 15/12/2008, 12:32
Avatar de pateketrueke
pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Resaltar palabras en una busqueda

con regex ???

si, puedes hacer unos look-ahead ....

revisa tus posibilidades, http://www.forosdelweb.com/f18/aport...s-pcre-646110/


por ejemplo, que solo capture si a la izquierda hay > y a la derecha < ... o algo así, la verdad nunca pude hacerlo con regex.... pero si desarrolle una técnica....

primero, respaldamos todos los <(.*)> por __!N__ marcas....

resalto mis búsquedas, y restauro las marcas... listo!

Código PHP:
/**
 * (contexto[, busqueda[, marcador[, separador]]])
 *
 * Resalta/Reemplaza palabras dentro de una cadena de texto.
 */
function search($text$find$repl '<strong>%s</strong>'$ord 32)
{
    
$char is_numeric($ord)? chr($ord): $ord[0]; // caracter?
    
$fn create_function('$test''static $_num = 0, $_tags;
            if (is_numeric($test[1])) return $_tags[$test[1]];
                        $_tags[$_num] = $test[1];
                $tag = "__!{$_num}__";
    ++$_num; return $tag;'
);

    
$text // escapamos tags tipo XML/BBCode
            
preg_replace_callback('/((?:<|&lt;|\[).+(?:>|&gt;|\]))/'$fn$text);

    
// ----------------------------- Resaltamos !
    
$found = array();
    
$word // separamos en palabras?
        
explode($char$find);

    foreach (
$word as $test)
    { 
// Escapamos las "wildcards"
        
$found []= preg_quote(strip_all($test));
    }

    
$expr join('|'$found); // unimos
    
$text // Aqui ocurre toda la magia....
        
preg_replace("/($expr)/is"strtr($repl, array('%s' => '\\1')), $text);

    
// recuperamos etiquetas HTML/BBCode
    
$text preg_replace_callback('/__!(\d+)__/'$fn$text);
    return 
$text;

ejemplo...

Código PHP:
$foo search($foo'esta es una palabra');
$bar search($bar'candy|baz|buzz''<b><em>%s</em></b>'124); 

sirve para HTML/BBCode, suerte!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Última edición por pateketrueke; 15/12/2008 a las 12:40