Foros del Web » Programando para Internet » PHP »

reemplazo de cadena

Estas en el tema de reemplazo de cadena en el foro de PHP en Foros del Web. Hola a todos La funcion es de sobra conocida pero falla y no se que solución darle Se trata de resaltar las palabras buscadas en ...
  #1 (permalink)  
Antiguo 20/05/2008, 14:01
Avatar de intergus  
Fecha de Ingreso: mayo-2007
Mensajes: 126
Antigüedad: 16 años, 11 meses
Puntos: 3
reemplazo de cadena

Hola a todos

La funcion es de sobra conocida pero falla y no se que solución darle

Se trata de resaltar las palabras buscadas en un texto.

Cojo la frase introducida y la paso por un explode para obtener los trozos en un array

luego hago un foreach del array trozos y voy sustituyendo la palabra o trozo de la misma por un codigo html para resaltarla.

Hasta aqui todo bien e incluso funciona cuando hay varias palabras, pero gracias al foreach como recorre tantas veces como palabras haya en la busqueda pues puede dar la casuakidad que una de las palabras buscadas coincida con una palabra del codigo html y ahi se joroba todo, porque en la segunda pasada el codigo html forma parte del texto donde seguir buscando el resto de palabras del array y en la tercera pasada pues mas codigo y por tanto mas riesgo.

imagina que busco "comprar Spa" en la primera pasada resalta comprar metiendo el codigo <span style.......> en la segunda pasada resalta las palabras spa pero tambien lo queire haxer con la etiqueta <span> con lo cual se va todo a la m.....

Soluciones:

he pensado sustituir por una cadena rara como #@palabra@# y al finalizar el foreach entonces hacer un reemplazo con el codigo html de apertura para los #@ y con los codigos de cierre para @#

No se si es una chapuza????????

Se os ocurre alguna idea??????????????????
  #2 (permalink)  
Antiguo 20/05/2008, 14:58
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: reemplazo de cadena

mmm... error simple, no uses un foreach....

intenta resaltando con preg_replace('/(abc|de una|ves|cualquiera)/', '<strong>\\1</strong>', $original);

SOLO que, procura no resaltar sobre HTML ya construido... ya que si bien, si se puede crear un resaltador efectivo... es dificultoso, asi que.... procura solo resaltar texto llano y vale....
  #3 (permalink)  
Antiguo 21/05/2008, 10:37
Avatar de intergus  
Fecha de Ingreso: mayo-2007
Mensajes: 126
Antigüedad: 16 años, 11 meses
Puntos: 3
Respuesta: reemplazo de cadena

No quería poner codigo para no liar la cosa pero creo que o yo no entiendo o no me expliqué bien.

primero con un explode cojo la cadena enviada por post y la separo en trozos, al final obtengo el array trozos con la palabras a resaltar.

Ahora recorro el array palabra a palabra con

foreach ($trozos as $trozo) {
if(strlen($trozo)>2){ // para no cambiar palabras pequeñas

$empresa = str_ireplace($trozo, "<span style='lo que sea'>".$trozo."</span>", $empresa);
$categor = str_ireplace($trozo, "<span style='otro estilo'>".$trozo."</span>", $categor);
$descripcion = str_ireplace($trozo, "<span style='y otro mas'>".$trozo."</span>", $descripcion);
}
}

esto va de perlas siempre que una de las palabras a canbiar no sea spa, pan, tyl, yle, etc....

He probado con preg_replace y quitando el foreach pero da errores.
  #4 (permalink)  
Antiguo 21/05/2008, 11:27
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: reemplazo de cadena

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....
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 21/05/2008, 12:31
Avatar de intergus  
Fecha de Ingreso: mayo-2007
Mensajes: 126
Antigüedad: 16 años, 11 meses
Puntos: 3
Respuesta: reemplazo de cadena

Gracias por el esfuerzo, me ha abierto los ojos.

Aunque ya lo solucioné del modo que dije, sale bastante más corto pues al final hago un remplazo de todas las combinaciones raras que he insertado y se acabó.

Gracias de nuevo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:52.