Foros del Web » Programando para Internet » PHP »

Evitar str_ireplace() y usar otra función que solo busque texto

Estas en el tema de Evitar str_ireplace() y usar otra función que solo busque texto en el foro de PHP en Foros del Web. Hola Amigos Foreros. Tengo un problema con un buscador de texto que trabaja con str_ireplace() que busca y reemplaza el texto. Necesito ayuda para que ...
  #1 (permalink)  
Antiguo 19/08/2015, 20:09
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Evitar str_ireplace() y usar otra función que solo busque texto

Hola Amigos Foreros. Tengo un problema con un buscador de texto que trabaja con str_ireplace() que busca y reemplaza el texto. Necesito ayuda para que no reemplace. Porque por ejemplo si escribo en el buscador "JOSE RUIZ" me modifica el original que es "José Ruiz"; necesito ayuda de cómo evitar la sustitución de mayúsculas y/o minúsculas.
Espero Aclararme un poco. Aquí muestro un gráfico de este defecto:



Pongo un fragmento del código:

Código PHP:
Ver original
  1. if($_POST)
  2. {
  3. $q=$_POST['search'];
  4. $sql_res=mysql_query("
  5.                      SELECT
  6.                            us.idUsuario, us.nombre, us.apellido, us.e_mail, us.idTipoUsuario                   
  7.                          FROM
  8.                            usuario us
  9.                          WHERE                                               
  10.                               us.idUsuario LIKE '%$q%'
  11.                            OR us.nombre LIKE '%$q%'
  12.                            OR us.apellido LIKE '%$q%'
  13.                            OR us.e_mail LIKE '%$q%'
  14.                          ORDER BY
  15.                               us.idUsuario LIMIT 5
  16.                     ");
  17.            
  18. while($row=mysql_fetch_array($sql_res))
  19. {  
  20. $idUsuario=$row['idUsuario'];
  21. $idTipoUsuario=$row['idTipoUsuario'];
  22. $tipoUsuario=mysql_query("
  23.                      SELECT                          
  24.                            tipUs.idTipoUsuario, tipUs.nombreTipoUsuario                        
  25.                          FROM                          
  26.                            tipoUsuario tipUs
  27.                          WHERE
  28.                            tipUs.idTipoUsuario='$idTipoUsuario'                        
  29.                     ");
  30. $rows=mysql_fetch_array($tipoUsuario);
  31. echo $nombreTipoUsuario=$rows['nombreTipoUsuario'];
  32.                
  33. $username= utf8_encode($row['nombre']);
  34. $userapellido=utf8_encode($row['apellido']);
  35. $email=$row['e_mail'];
  36.  
  37. $b_idUsuario='<strong>'.$q.'</strong>';
  38. $b_username='<strong>'.$q.'</strong>';
  39. $b_userapellido='<strong>'.$q.'</strong>';
  40. $b_email='<strong>'.$q.'</strong>';
  41.  
  42. $final_idUsuario = str_ireplace($q, $b_idUsuario, $idUsuario);
  43. $final_username = str_ireplace($q, $b_username, $username);
  44. $final_userapellido = str_ireplace($q, $b_userapellido, $userapellido);
  45. $final_email = str_ireplace($q, $b_email, $email);
  46.  
  47.  
  48. ?>
  49. <div class="show" align="left">
  50. <img src="author.PNG" style="width:50px; height:50px; float:left; margin-right:6px;" /><span class="name" ><?php echo $final_username." ".$final_userapellido;?><?php echo " < ".$final_email; echo " > idUsuario: ".$final_idUsuario ?></span>&nbsp;<br/><br/>  
  51. </div>
  #2 (permalink)  
Antiguo 19/08/2015, 22:07
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Evitar str_ireplace() y usar otra función que solo busque texto

Código PHP:
Ver original
  1. <?php
  2.     function tagHighlight($text, $word, $tag = "strong") {
  3.         $srLen = strlen($word);
  4.         $ohLen = strlen($tag) + 5;
  5.         $iPos = -1;
  6.         while(($iPos = stripos($text, $word, $iPos + 1)) !== false) {
  7.             $text = substr_replace($text, "<$tag>".substr($text, $iPos, $srLen)."</$tag>", $iPos, $srLen);
  8.             $iPos += $srLen + $ohLen;
  9.         }
  10.  
  11.         return $text;
  12.     }
  13.  
  14.     $text = "Hola, Esto es una prueba, y esTo tambien, osea que todo esto, solo sirve para probar a ESTO.";
  15.     $word = "esto";
  16.  
  17.     echo tagHighlight($text, $word);
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #3 (permalink)  
Antiguo 20/08/2015, 06:03
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Evitar str_ireplace() y usar otra función que solo busque texto

Buenísima tu respuesta Colaborador. Muchas gracias! Estoy adaptándolo al buscador:
Funciona!
Me surgió una pregunta: ¿habrá alguna forma que en la búsqueda reconozca el texto a partir de la primera letra del texto? Porque funciona solo para la palabra completa.

Si escribo, por ejemplo "gon" de Gonzalez no me sale nada, pero tendría que dar resultados como "Gonzalez" o "Gonzalo".

Código que funciona con tu función y con palabra completa:

Código PHP:
Ver original
  1. $text = $username;
  2.  $word = $q;
  3.    echo tagHighlight($text, $word);
  #4 (permalink)  
Antiguo 20/08/2015, 08:14
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Evitar str_ireplace() y usar otra función que solo busque texto

Quizás tengas un problema con los utf8_encode.
Cuando dices que no te sale nada, a que te refieres exactamente? a que la base de datos no retorna nada o a que la función no lo resalta?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #5 (permalink)  
Antiguo 20/08/2015, 11:51
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Evitar str_ireplace() y usar otra función que solo busque texto

Huy, no me expliqué bien. En realidad sí sale cuando se escribe la palabra correcta (completa) , es decir si escribo Gonzalo me aparece Gonzalo, pero necesitaba saber la forma si escribo Gonza me aparezca (busque) las opciones que tengo en mi BD como Gonzalo o Gonzalez.

De esta forma, como al inicio del primer post:


Última edición por mikehove; 20/08/2015 a las 12:03
  #6 (permalink)  
Antiguo 20/08/2015, 15:07
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Evitar str_ireplace() y usar otra función que solo busque texto

Sigo sin entender.
Código PHP:
Ver original
  1. $text = "Hola, Esto es una prueba, y esTo tambien, osea que todo esto, solo sirve para probar a ESTO.";
  2.     $word = "es";
  3.  
  4.     echo tagHighlight($text, $word);
Hola, Esto es una prueba, y esTo tambien, osea que todo esto, solo sirve para probar a ESTO.

En la query tienes esto:
Cita:
us.nombre LIKE '%$q%'
con lo cual tendria que funcionar, asegurate que el cotejamiento de los campos en la base de datos este puesto en utf8_spanish_ci o similar.

Puedes probar a ejecutar la query manualmente en la base de datos, para ver si efectivamente retorna los resultados esperados.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #7 (permalink)  
Antiguo 20/08/2015, 17:48
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Evitar str_ireplace() y usar otra función que solo busque texto

Quiero agradecerte Colaborador. El error que tenía es porque tenía todo el código en el bucle, sacándolo funciona bien!

Solo dentro del bucle, quedó así:

Código PHP:
Ver original
  1. $final_username = tagHighlight($username, $q);
  2. $final_userapellido = tagHighlight($userapellido, $q);
  3. $final_email = tagHighlight($email, $q);

Gracias por tu tiempo y gran ayuda!!

Etiquetas: Ninguno
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 10:44.