Foros del Web » Programando para Internet » PHP »

substr y buscador

Estas en el tema de substr y buscador en el foro de PHP en Foros del Web. Hola Estoy seguro de haberlo leido en un post, pero no lo encuentro Tengo un buscador sencillísimo que me arroja los resultados en una tablita ...
  #1 (permalink)  
Antiguo 07/08/2003, 13:14
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
substr y buscador

Hola

Estoy seguro de haberlo leido en un post, pero no lo encuentro

Tengo un buscador sencillísimo que me arroja los resultados en una tablita html.

Estos resultados me resaltan la palabra encontrada y usando substr($cadena, 0, 300) hago que me muestre sólo los primeros 300 caracteres.

Lo que quiero es que en vez de que sean del 0 al 300 sean desde la palabra encontrada hasta 300 más.

¿Cómo se hace? Con que me digan con qué función o dónde busco es suficiente, pero no me molesto si me pasan un script

Saludos y gracias!!!
  #2 (permalink)  
Antiguo 07/08/2003, 13:44
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 2 meses
Puntos: 5
A ver...

DESDE el principio hasta 300 caracteres despues de la palabra?

o DESDE la palabra encontrada solamente?

Código PHP:
//La primera opción sería así...

$nuevacadena substr($cadena,0,strpos($cadena,$palabra) + 300);

//La segunda sería así...

$nuevacadena substr($cadena,strpos($cadena,$palabra), 300); 
__________________
Manoloweb
  #3 (permalink)  
Antiguo 07/08/2003, 14:32
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
Gracias, funcionó muy bien!!!

Sólo un detalle...

Dado el texto: "En esta tienda se realizan muchas ventas de Mayoreo"

si busco por "mayoreo" lo encuentra, pero no funciona el substr, y si busco por "Mayoreo" (con mayúscula) sí funciona. ¿Cómo podría solucionar aquello?

Dicho de otra forma, ¿Cómo hago que las mayúsculas o los acentos no influyan en el resultado de la búsqueda y que igual funcione con las palabras: pájaro, pajaro, Pájaro, Pajaro o PAJARO?

Porque de que las encuentra, las encuentra, pero ni me las colorea ni hace el substr.

Gracias
  #4 (permalink)  
Antiguo 07/08/2003, 14:35
Avatar de goncafa  
Fecha de Ingreso: julio-2002
Ubicación: Santiago
Mensajes: 1.211
Antigüedad: 21 años, 9 meses
Puntos: 10
pues para evitarte esos problemas debes hacegurarte de antes de meter los textos a la base de datos o bien, transformarlo todo a mayuscula o todo a minuscula, luego antes buscar, haces lo mismo con el texto a buscar.

Saludos
__________________
se despide hasta la proxima
Gonzalo Castillo
  #5 (permalink)  
Antiguo 07/08/2003, 14:39
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
Gracias por la sugerencia :)

El problema es que necesito que tanto al insertar como al recuperar los textos estos estén escritos correctamente, porque son largos como para dejarlos todos en mayúsculas o me pondría las primeras letras después del punto o de nombres propios en minúsculas.

Saludos
  #6 (permalink)  
Antiguo 07/08/2003, 14:42
Avatar de goncafa  
Fecha de Ingreso: julio-2002
Ubicación: Santiago
Mensajes: 1.211
Antigüedad: 21 años, 9 meses
Puntos: 10
pues entonces transforma todo el texto a mayuscula o minuscula pero despues de k lo hayas leido, me explico, si el texto lo lees de la base de datos a una variable, esta ahora va a estar en memoria y no en la base de datos, por tanto, estaras modificando la variable, el texto de la base de datos te kedara igual

Saludos
__________________
se despide hasta la proxima
Gonzalo Castillo
  #7 (permalink)  
Antiguo 07/08/2003, 14:49
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
Eso sí que es responder rápido

Lo malo es que eso haría que lo que lee el usuario esté todo en mayúsculas o minúsculas, y como son artículos largos y es importante mantener la ortografía y la facilidad de lectura, dejaría esa opción como último recurso.

De todos modos lo probé y funciona con mayúsculas/minúsculas pero no me soluciona lo de los acentos.

La búsqueda funciona bien. Los que están peleándose con los acentos y mayúsculas son el substr y el strpos.

Gracias de todas formas
  #8 (permalink)  
Antiguo 07/08/2003, 14:51
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 2 meses
Puntos: 5
Hay una mejor forma...

Esperame...
__________________
Manoloweb
  #9 (permalink)  
Antiguo 07/08/2003, 14:53
Avatar de goncafa  
Fecha de Ingreso: julio-2002
Ubicación: Santiago
Mensajes: 1.211
Antigüedad: 21 años, 9 meses
Puntos: 10
pues i kieres k el usuario vea correctamente, ya saves de donde parte el texto a mostrar y donde termina, solo que para mostrarla podria leerlo aotra vez de la base de datos k es donde esta como quieres k se muestre , claro, todo esto puede hacer k tu script se tarde mas en procesar, pues son muchas cosas las k estamos haciendo

Con respecto a los caentos y estas cosas, pues ya no se si abra alguna funcion a demas saque todos los acentos ...

pero es cosa de empezar a buscar soluciones no

Saludos
__________________
se despide hasta la proxima
Gonzalo Castillo
  #10 (permalink)  
Antiguo 07/08/2003, 15:05
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 2 meses
Puntos: 5
Código PHP:
<?
//Primero creas una funcion que te deje todo SIN acentos
//y todo en minusculas

$varConAcento = array ("/á/""/é/""/í/""/ó/""/ú/""/Á/""/É/""/Í/""/Ó/""/Ú/");
$varSinAcento = array ("a""e""i""o""u""A""E""I""O""U");
function 
cambia ($texto) {
    
$texto preg_replace($GLOBALS["varConAcento"], $GLOBALS["varSinAcento"], $texto);
    
$texto strtolower($texto);
    return 
$texto;
}

//Ahora le aplicas la funcion a tu cadena y a la palabra

$palabraN=cambia($palabra);
$cadenaN=cambia($cadena);

//Entonces ya puedes hacerles lo que quieras
//ya que estan las dos convertidas

?>
__________________
Manoloweb
  #11 (permalink)  
Antiguo 07/08/2003, 15:13
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 2 meses
Puntos: 5
Ahora que si lo quieres hacer desde MySQL...

Dame un momento y te paso un codigo muuy loco pero que puede servirte...
__________________
Manoloweb
  #12 (permalink)  
Antiguo 07/08/2003, 15:35
Avatar de biblio  
Fecha de Ingreso: enero-2002
Ubicación: Urano
Mensajes: 577
Antigüedad: 22 años, 3 meses
Puntos: 0
A veces es mejor dar solo el ingrediente y no cocinarselos, así aprende mas el interesado.

Saludos
  #13 (permalink)  
Antiguo 07/08/2003, 16:23
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 2 meses
Puntos: 5
Bueno, pues tienes razón biblio... pero a veces estos retos me gustan (y me sirven)

Aqui te paso el código, que combina expresiones regulares tanto en MySQL como en PHP...

Adaptarlo a tu sistema va a ser fácil, pero vas a necesitar entender que es lo que hace... así que a echarle ganas!!!

Código PHP:
<?
//Primero creas una funcion que te deje todo SIN acentos
//y todo en minusculas

$palabra="Manoloweb";

$varConAcento = array ("/á/""/é/""/í/""/ó/""/ú/""/Á/""/É/""/Í/""/Ó/""/Ú/");
$varSinAcento = array ("a""e""i""o""u""A""E""I""O""U");
function 
cambia ($texto) {
    
$texto preg_replace($GLOBALS["varConAcento"], $GLOBALS["varSinAcento"], $texto);
    
$texto strtolower($texto);
    return 
$texto;
}

//Ahora le aplicas la funcion a la palabra

$palabraN cambia($palabra);

//AQUI VIENE LO INTERESANTE...
$reg="";
for (
$i=0;$i<strlen($palabraN);$i++){
    if (
$palabraN{$i}=="a" || $palabraN{$i}=="á") {
        
$reg.="[a|á]";
    } elseif (
$palabraN{$i}=="e" || $palabraN{$i}=="é") {
        
$reg.="[e|é]";
    } elseif (
$palabraN{$i}=="i" || $palabraN{$i}=="í") {
        
$reg.="[i|í]";
    } elseif (
$palabraN{$i}=="o" || $palabraN{$i}=="ó") {
        
$reg.="[o|ó]";
    } elseif (
$palabraN{$i}=="u" || $palabraN{$i}=="ú") {
        
$reg.="[u|ú]";
    } else {
        
$reg.=$palabraN{$i};
    }
}

//Ahora construimos el query para MySQL

$qry="SELECT * FROM tabla WHERE campotexto REGEXP '$reg'";

///aqui te conectas///

$qr=mysql_query($qry);
while (
$rs=mysql_fetch_array($qr)) {
    
preg_match_all('/('.$reg.')([\s\S]*)/'$rs["campotexto"], $cadenaNPREG_SET_ORDER);
    
$coincidencias[]=substr($cadenaN[0][0],0,300);
}

//Ahora si, el array $coincidencias tiene un registro para cada
//Cadena encontrada, 300 caracteres a partir de la primera coincidencia...

?>

__________________
Manoloweb
  #14 (permalink)  
Antiguo 09/08/2003, 11:02
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
Gracias Manoloweb y goncafa!!!

Me temo que entiendo la lógica de la propuesta de Manoloweb, pero llevo un par de días tratando de adaptarlo y lo único que consigo es que aparesca la palabra 'Array' varias veces según la cantidad de resultados :P

Creo que como dice Biblio, necesito documentarme más (mucho más) antes de aventarme a cosas tan raras.

De todos modos, mil millones de gracias!!! Pese a que no salió lo del substr y el srtpos cuando el usuario hace una búsqueda de una palabra que debiera llevar acento y no se lo pone, gracias a su ayuda ya funciona el buscador de manera bastante aceptable.

Saludos y de nuevo un gogolplex de gracias.
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 22:02.