Foros del Web » Programando para Internet » PHP »

str_replace() mayusculas

Estas en el tema de str_replace() mayusculas en el foro de PHP en Foros del Web. Estoy trabajando en un buscador, lo que quiero es que al mostrar los resultados, la cadena buscada se imprima en un color diferente al resto ...
  #1 (permalink)  
Antiguo 25/11/2002, 23:00
Avatar de ||Dj||  
Fecha de Ingreso: enero-2002
Mensajes: 2.349
Antigüedad: 15 años, 11 meses
Puntos: 1
str_replace() mayusculas

Estoy trabajando en un buscador, lo que quiero es que al mostrar los resultados, la cadena buscada se imprima en un color diferente al resto del texto, algo bastante comun en cualquier buscador, el codigo es este:

Código PHP:
$nombre $row['nombre'];
$colorear "<font color=\"#FFFF00\">".$c1."</font>";
$nombre str_replace($c1$colorear$nombre);
echo 
$nombre
El problema es que la funcion distingue entre mayusculas y minusculas, si el usuario ingreso la palabra "texto" se va a resaltar "texto", pero no asi "Texto".

alguien tiene idea como lo soluciono sin tener que que pasar a minusculas la variable $nombre?

gracias de antemano.
  #2 (permalink)  
Antiguo 25/11/2002, 23:47
Avatar de urjose  
Fecha de Ingreso: diciembre-2001
Mensajes: 5.286
Antigüedad: 16 años
Puntos: 1
Bueno yo lo haría así

Código PHP:
$nombre explode(" ",$row['nombre']);
foreach(
$nombre as $palabra)
{
    if (
strcasecmp($palabra,$palabrabuscada)==0)
        echo 
"<font color=\"#FFFF00\">$palabra</font>";
    else 
        echo 
$palabra;

Bueno mis conocimientos son pocos en y supongo que se podrá ahcer con expresiones regulares o algo

Saludos

Última edición por urjose; 26/11/2002 a las 14:00
  #3 (permalink)  
Antiguo 26/11/2002, 10:30
Avatar de ||Dj||  
Fecha de Ingreso: enero-2002
Mensajes: 2.349
Antigüedad: 15 años, 11 meses
Puntos: 1
Gracias por contestar, pero funciona unicamente cuando la palabra buscada es igual a la cadena y no si es parte de ella.

Alguna otra idea?


saludos.
  #4 (permalink)  
Antiguo 26/11/2002, 15:14
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Hola,

Puedes probar con eregi_replace(). Seria algo asi:
Código PHP:
eregi_replace($c1"<font color=\"#FFFF00\">\\0</font>"$nombre); 
el \\0 es la cadena que coincide con el patron ($c1). Esto lo he sacado de los caomentarios de los usuarios de la pagina del manual http://www.php.net/manual/en/function.eregi-replace.php , asi que no se si funciona, aunque la logica es buena.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #5 (permalink)  
Antiguo 26/11/2002, 15:33
Avatar de ||Dj||  
Fecha de Ingreso: enero-2002
Mensajes: 2.349
Antigüedad: 15 años, 11 meses
Puntos: 1
Gracias josemi. ya lo habia probado y tampoco va.

Saludos.
  #6 (permalink)  
Antiguo 26/11/2002, 17:36
Avatar de chubu  
Fecha de Ingreso: enero-2002
Ubicación: Buenos Aires
Mensajes: 133
Antigüedad: 15 años, 10 meses
Puntos: 0
Puedes hacer tu propia funcion, que o que tendria que hacer es ir recorriendo el texto en busca del string que quieres tesaltar (puedes usar strpos o preg_match), y primero deberias pasar ambos strings a mayusculas o minusculas, digamos algo asi:

Código PHP:
function resaltar_palabras($texto$palabras)
  {
   
// en $texto viene el texto original
   // en $palabras viene el "criterio de busqueda"

   // pasamos todo a mayusculas, pero en variables auxiliares
   
$textoM strtoupper($texto);
   
$palabrasM strtoupper($palabras);

   
// voy a trabajar sobre esta otra variable
   
$textoS $texto;

   
// armo un array con las palabras
   
$lista_palabras explode(" ",$palabrasM);

   
// recorro el array de palabras
   
foreach($lista_palabras as $palabra)
   {
    
// ahora reocrro el texto
    
while($pos strpos($textoM$palabra))
    {
     
$len strlen($palabra);

     
// reemplazo en ambos strings, para mantener una relacion de tamaño en ambos
     
$textoS substr($textoS0$pos)."<font color='#ffff00'>".substr($textoS$pos$len)."</font>".substr($textoS, ($pos+$len));
     
// en el estring auxiliar reemplazamos por blancos, para no entrar en un loop infernal
     
$textoM substr($textoM0$pos)."<font color='#ffff00'>".str_pad(" "$len" ")."</font>".substr($textoM, ($pos+$len));
    }
   }
   
   return 
$textoS;
  } 
la función está documentada, igual quedarian algunas cosas por salvar, como los acentos y esos asuntos, pero con un tratamiento de str_replace y un poco de maña se puede lograr algo muy bueno, si necesitas una mano con eso avisa.

saludos,

chubu
__________________
:pensando:hay algo mal que no anda bien
  #7 (permalink)  
Antiguo 26/11/2002, 19:07
Avatar de ||Dj||  
Fecha de Ingreso: enero-2002
Mensajes: 2.349
Antigüedad: 15 años, 11 meses
Puntos: 1
Gracias chubu ahora le pego un vistazo y te comento
  #8 (permalink)  
Antiguo 26/11/2002, 20:32
Avatar de ||Dj||  
Fecha de Ingreso: enero-2002
Mensajes: 2.349
Antigüedad: 15 años, 11 meses
Puntos: 1
chubu: le di un vistazo rapido y aparentemente funciona a la perfeccion.

Gracias viejo
  #9 (permalink)  
Antiguo 26/11/2002, 20:51
Avatar de ||Dj||  
Fecha de Ingreso: enero-2002
Mensajes: 2.349
Antigüedad: 15 años, 11 meses
Puntos: 1
ahora analizandolo mas detenidamente veo que no funciona cuando la palabra buscada coincide con el comienzo de la cadena

por ej:

sobre la palabra "foros"

si se ingresa "oro" si funciona
pero buscando por "for" ahi no

voy a ver si lo puedo solucionar.
  #10 (permalink)  
Antiguo 27/11/2002, 14:29
Avatar de chubu  
Fecha de Ingreso: enero-2002
Ubicación: Buenos Aires
Mensajes: 133
Antigüedad: 15 años, 10 meses
Puntos: 0
dj,

revise la funcion y era una pavada, no tuve en cuenta que si alguna de las palabras aparece en el primer espacio (offset 0), no iba a entrar al while nunca, asi que cambie la condicion del while, la funcion queda asi:

Código PHP:
  function resaltar_palabras($texto$palabras)
  {
   
// en $texto viene el texto original
   // en $palabras viene el "criterio de busqueda"

   // pasamos todo a mayusculas, pero en variables auxiliares
   
$textoM strtoupper($texto);
   
$palabrasM strtoupper($palabras);

   
// voy a trabajar sobre esta otra variable
   
$textoS $texto;

   
// armo un array con las palabras
   
$lista_palabras explode(" ",$palabrasM);

   
// recorro el array de palabras
   
foreach($lista_palabras as $palabra)
   {
    
// ahora reocrro el texto
    
while(!(($pos strpos($textoM$palabra)) === false))
    {
     
$len strlen($palabra);

     
// reemplazo en ambos strings, para mantener una relacion de tamaño en ambos
     
$textoS substr($textoS0$pos)."<font color='#ff0000'>".substr($textoS$pos$len)."</font>".substr($textoS, ($pos+$len));
     
// en el estring auxiliar reemplazamos por blancos, para no entrar en un loop infernal
     
$textoM substr($textoM0$pos)."<font color='#ff0000'>".str_pad(" "$len" ")."</font>".substr($textoM, ($pos+$len));
    }
   }
   
   return 
$textoS;
  } 
habria que ver el tema de que si buscas "aguja" matchee "agúja", y casos similares de acentos y enies, pero como te dije antes, con hacer un par de str_replace en $palabrasM y en $textoM, antes de hacer el explode se tendria que solucionar el asunto.

saludos,

chubu
__________________
:pensando:hay algo mal que no anda bien
  #11 (permalink)  
Antiguo 27/11/2002, 16:33
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
No es por resultar pesado, pero a mi este codigo me funciona:

<?php
$texto="La palabra a buscar es \"PALABRA\". Palabra, aunque este mal escrita,\n como pAlAbRa.";
$buscar="PALABRA";
$texto_fin=eregi_replace($buscar,'<font color="red">\0</font>',$texto);
echo nl2br($texto_fin);
?>

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #12 (permalink)  
Antiguo 28/11/2002, 13:03
Avatar de ||Dj||  
Fecha de Ingreso: enero-2002
Mensajes: 2.349
Antigüedad: 15 años, 11 meses
Puntos: 1
gracias a todos por la mano.
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 02:12.