jaime
30 Oct 2003, 09:59 AM
No se si en este foro se pueden plantear problemas de programación, pero como he visto que hay un apartado dedicado al tema, aunque vacío, ahí va mi pregunta...
Tengo un foro PHPBB en foro.alazan.com en el que he capado las búsquedas internas, porque su sistema de optimización hacía que ocupara mucho en las tablas de la base de datos.
Por ello, he programado un buscador externo, desde www.electroduendes.net, para hacer búsquedas de texto en los mensajes publicados en los foros. Por el momento funciona bastante bien, pero tengo un problemilla al buscar palabras que forman parte de otras mayores:
¿Cómo puedo hacer para que al buscar una palabra, no me devuelva los resultados en los que aparece esa palabra dentro de otra?
Me explicaré mejor: si busco la palabra "rico", no quiero que me la encuentre ni en "ricos" ni en "excéntrico", por ejemplo. Sólo cuando encuentre la palaba exacta "rico" dentro del campo. Por ejemplo, en "soy un hombre rico con mucho dinero".
Ahora mismo la búsqueda la hago de este modo:
post_text LIKE '%rico%'
Pero claro, eso me devuelve las cadenas que incluyen "rico" dentro de ellas, y no es lo que quiero. Si fuerzo a que tengan espacios antes y después, de este modo:
post_text LIKE '% rico %'
no me encontraría las cadenas que comiencen o terminen con "rico" sin el espacio, por ejemplo "rico es una palabra" o "esto está muy rico".
He pensado también esta otra manera:
post_text LIKE '[ ]*rico[ ]*'
Esto es, cero o más apariciones de espacios antes y después, pero entonces si el campo contiene otros caracteres aparte de los espacios y "rico", tampoco funcionaría.
Finalmente, esta otra posibilidad:
post_text LIKE '%[ ]*rico[ ]*%'
sería equivalente a la primera...
¿Cómo hacerlo?
macius
30 Oct 2003, 01:19 PM
Con expresiones regulares quedario algo asi como like '%^rico$%';
La verdad es que con las expresiones regulares siempre me acabo peleando, pero deben ir por ahí los tiros
shilmar
30 Oct 2003, 01:31 PM
creo que
'%^rico$%';
no es correcto
ya que el^ creo que era inicio de linea con lo que no es demasiado apropiado
jaime
30 Oct 2003, 02:03 PM
Quizá no se pueda especificar en una sola expresión regular, y sea necesario hacer el OR de varias condiciones:
* Que la palabra esté al principio del campo, seguida por un espacio, punto, coma o punto y coma:
'rico[ .,;]%', como en "Rico helado"
* Que esté al final del campo, precedida por espacio, punto, coma o punto y coma:
'%[ .,;]rico', como en "Un helado muy rico"
* Que esté en medio, con espacios, puntos o comas a ambos lados:
'%[ .,;]rico[ .,;]%' como en "Lolo Rico, es tonta"
Quizá estos tres casos estén resumidos en el tercero, '%[ .,;]rico[ .,;]%'
Lo que pasa es que creo que el punto es un caracter especial en los patrones, así que no me vale... Qué lio...
shilmar
30 Oct 2003, 08:32 PM
para una expresion regular
(.*)rico(.)*
deberia valerte
javi
30 Oct 2003, 09:49 PM
post_text REGEXP '[[:<:]]set[[:>:]]'
jaime
31 Oct 2003, 04:07 PM
Gracias por las respuestas, pero la expresión proporcionada por shilmar no devuelve ningún resultado, y la de javi me dice que sintaxis incorrecta, debe ser que REGEXP es propio de mySQL. Yo trabajo con ASP y SQL Server...
Sigo pensando que no se puede hacer con una sola expresión regular, habrá que hacerlo usando expresiones regulares combinadas con todos los casos de espacios, comas, puntos, etc...
En resumen, lo que quiero es encontrar las filas de la base de datos cuyo campo post_text contenga la palabra "rico", sin que esté pegada ni por delante ni por detrás a ningún caracter excepto, en todo caso, espacio, coma, punto o punto y coma.
javi
31 Oct 2003, 04:18 PM
| QUOTE |
| debe ser que REGEXP es propio de mySQL |
Al hablar de PhpBB supuse que trabajabas con MySQL...
jaime
31 Oct 2003, 05:45 PM
Ya me imaginaba... es phpBB pero yo no tengo acceso a los códigos, viene preinstalado con el servidor que tengo contratado, pero está en un servidor PHP aparte, accediendo no a mySQL sino a SQLServer. Y los códigos del buscador los hago en ASP, no puedo ejecutar PHP ni modificar el PHPBB.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please
click here.