Foros del Web » Programando para Internet » ASP Clásico »

Extraer cadena alrededor de una palabra

Estas en el tema de Extraer cadena alrededor de una palabra en el foro de ASP Clásico en Foros del Web. Quisiera conseguir que al buscar una/s palabra/s en un buscador de una web de noticias (con dos campos en la db, titular y cuerpo) se ...
  #1 (permalink)  
Antiguo 05/02/2003, 13:38
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 23 años, 2 meses
Puntos: 2
Extraer cadena alrededor de una palabra

Quisiera conseguir que al buscar una/s palabra/s en un buscador de una web de noticias (con dos campos en la db, titular y cuerpo) se muestre, para cada noticia encontrada, el texto que rodea en el cuerpo de la noticia a la palabra buscada.

El sistema que digo es parecido al de Google.

Ejemplo (para explicarme mejor): Si busco la palabra "tren", quiero que en los resultados se muestre la cadena de texto que rodea esa palabra (digamos las cinco palabras anteriores y las cinco posteriores a la palabra buscada):

"...el detenido cogió el tren y se dirigió hacia la frontera de .."

Gracias.
  #2 (permalink)  
Antiguo 05/02/2003, 21:36
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 23 años, 3 meses
Puntos: 5
Eso se hace con expresiones regulares...

No tengo a la mano ninguna liga, pero no te resultara dificil ahora que conoces el nombre del procedimiento que necesitas.


Regular Expressions

ó

REGEXP


No recuerdo al punto la sintaxis en ASP, pero debe ser algo así... (no lo tomes literal, no conozco el objeto a utilizar)

RegExp.Path="tren"
RegExp.ReplacePath="<b>tren</b>"
RegExp.Execute (TuTextoResultado)

Espero haberte orientado.
__________________
Manoloweb
  #3 (permalink)  
Antiguo 05/02/2003, 22:27
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 24 años, 2 meses
Puntos: 535
Manoloweb, yo de expresiones regulares sé poco y nada pero por lo que puedo llegar a entender de tu ejemplo, no satisfacería los requerimientos de mrgubu ya que necesita no sólo resaltar el criterio de búsqueda (que con un simple replace alcanzaría, creo) sino que, además, necesita "recortar" de la totalidad de palabras del texto las 5 anteriores y posteriores a la palabra que concuerde con el criterio de búsqueda.

En la tarde estuve intentando hacer un script para ofrecerle pero por diversas cuestiones no pude finalizarlo... es más, quedó en un intento sin pulir y con algunos errores lógicos que paso a detallar:

Si la palabra buscada se encuentra antes de la quinta desde el comienzo del texto a buscar y/o hay menos de 5 palabras luego de ella hasta el fin de dicho string, el script falla.

Igualmente lo dejo por si a alguien le interesa y puede hacer algo con el:



<%
Criterio = "tren"

Dim Str(1)
Str(0) = "pero luego, el detenido cogió el tren y se dirigió hacia la frontera de argentina dónde se escaparía de las autoridades policiales."
Str(1) = "entonces fue cuando de repente el tren descarriló estallando en millones de partes."

For j = 0 to UBound(Str)

PosCriterio = InStr(Str(j), Criterio)
StrPreviaTmp = Trim(Left(Str(j), PosCriterio - 1))
StrPosteriorTmp = Trim(Right(Str(j), Len(Str(j)) - PosCriterio - Len(Criterio)))
PalabrasPrevias = Split(StrPreviaTmp, " ")
PalabrasPosteriores = Split(StrPosteriorTmp, " ")

Response.Write CHR(034) & "..."
For i = 4 to 0 step - 1
Response.Write PalabrasPrevias(UBound(PalabrasPrevias)-i) & " "
Next

Response.Write "<b>" & Criterio & "</b> "

For i = 0 to 4
Response.Write PalabrasPosteriores(i) & " "
Next

Response.Write "..." & CHR(034)

Response.Write "<p></p>"

Next
%>
  #4 (permalink)  
Antiguo 06/02/2003, 09:55
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 23 años, 3 meses
Puntos: 5
Pues las Expresiones regulares lo solucionan mucho mas facil...

Dejame pelearme con un ejemplo y lo posteo para referencia...

( Por fin podre enseñarle algo a DAZUAGA!!!)
__________________
Manoloweb
  #5 (permalink)  
Antiguo 06/02/2003, 10:30
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 24 años, 2 meses
Puntos: 535
Si, si. La expresiones regulares lo solucionarían mucho más fácil y con mayor eficiencia; pero como te dije, no las sé usar ya que como mi servidor no las acepta nunca intenté con ellas.

y te comento que hay muuuchas cosas que podrías enseñarme. Estaría bueno que empieces con un tuto para principiantes sobre ellas
  #6 (permalink)  
Antiguo 06/02/2003, 11:50
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 23 años, 3 meses
Puntos: 5
Bueno, aqui esta el resultado para MRGUBU, utiliza esto:

Código:
<%
Function Cambia(ElTexto,LaBusqueda)
Dim Expresion, Patron
Set Expresion= New RegExp
Expresion.Pattern = ("((\S+\s+){0,5})("&LaBusqueda&"[\.,:;]*)((\s+\S+){0,5})")
Expresion.IgnoreCase = True   
Expresion.Global = True   
Set Matches=Expresion.Execute(ElTexto)
   For Each Match in Matches
      ElResultado = ElResultado& "..."& Match.Value & "... <br>"
   Next
   Cambia = ElResultado
End Function


Dim Texto
Texto="El Tren: Muchos perros han caminado por este sendero triste y desolado, donde el tren pasa todas las mañanas haciendo un ruido insoportable que despierta hasta a don José, el simple sonido de el tren"

Response.write (Cambia(Texto,"tren"))

%>
Como podras darte cuenta, si la función se encuentra varias veces la palabra en el mismo texto, te dará una linea para cada una de las coincidencias, si quieres que aparezcan todas en una linea, quitale el <br>...

Solo llama la funcion así: Response.write (Cambia("Aqui pon el texto que deseas revisar","aqui pones la palabra buscada"))


Saludos!!
__________________
Manoloweb

Última edición por Manoloweb; 06/02/2003 a las 23:20
  #7 (permalink)  
Antiguo 06/02/2003, 11:55
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 23 años, 3 meses
Puntos: 5
Dazuaga

Ah!! y claro, muy pronto colocaré un tutorial sobre el uso de esta herramienta tan util.

Cuenta con ello.


Saludos desde Monterrey
__________________
Manoloweb
  #8 (permalink)  
Antiguo 06/02/2003, 23:22
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 23 años, 3 meses
Puntos: 5
Por fin... a alguien le sirvió???

__________________
Manoloweb
  #9 (permalink)  
Antiguo 07/02/2003, 12:35
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 23 años, 2 meses
Puntos: 2
Desde que posteé el mensaje no he podido volver a entrar a los foros hasta ahora mismo.

Así que lo primero, Gracias Dazuaga y Manoloweb por vuestro interés en intentar resolver el problema planteado. Voy a probar vuestras propuestas en mi servidor, a ver que tal.......
  #10 (permalink)  
Antiguo 08/02/2003, 06:20
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 23 años, 2 meses
Puntos: 2
Eureka!!!

Manoloweb, eres un fenómeno! A pesar de que mis conocimientos de ASP son todavía endebles, he conseguido poner a funcionar tu código en mi web Granadalinks.com:

Entrad en http://granadalinks.com/ y buscad lo que queráisen la sección Foto de la semana (no en la sección Links que es la que viene seleccionada por defecto en el combobox del buscador) . Os sugiero que empecéis por ejemplo por la palabra "Granada" o "sierra nevada" . ¡Eureka, Funciona!

Sin embargo, aún me quedan por solucionar algunos problemas ajenos al código de Manoloweb. El buscador de mi web es una adaptación del sistema de WebWizGuide.com.

El primer problema que se me plantea, que seguramente será sencillo pero no consigo resolver, es que quiero que la palabra buscada aparezca en negrita en las distintas cadenas de texto encontradas. No consigo insertar las etiquetas <b> y </b> en el sitio adecuado para que funcione.

El segundo problema ya es más complicado y me temo que me va a costar resolver. Veamos: si se realiza la búsqueda (siempre en la sección Foto de la semana, eligid siempre esta opción en el combo del buscador) utilizando el operador booleano "o" en vez del "y" que viene por defecto, no se muestra ninguna cadena de texto en ninguno de los resultados hallados. ¿Alguna sugerencia?

Por último, Manoloweb ¿cómo podría reducir los resultados mostrados con tu Function a las cuatro primeras cadenas de texto encontradas en cada registro (en lugar de que muestre todas las cadenas)?

Gracias por vuestra ayuda amigos. ¡Qué sería de mi web sin los Forosdelweb!
  #11 (permalink)  
Antiguo 08/02/2003, 13:49
Avatar de Sir Matrix  
Fecha de Ingreso: octubre-2000
Ubicación: Dentro de mi cabeza. ono?
Mensajes: 1.264
Antigüedad: 24 años, 7 meses
Puntos: 3
qué son las expresiones regulares e irregulares??
__________________
|||| ))>_<(( ||||
www.webmagic.cl <-- esta pagina está mala, no la busquen
  #12 (permalink)  
Antiguo 12/02/2003, 15:36
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 23 años, 3 meses
Puntos: 5
Je je!! sorry..

No había vuelto a entrar a esta pregunta, pero, no hay problema, es muy sencillo solucionar los dos puntos que coementas en tu mensaje...

El primero se soluciona con otra aplicacioncilla de EXPRESIONES REGULARES ( ) y la segunda con un For...

Dame unos minutos y te posteo mi propuesta.

__________________
Manoloweb
  #13 (permalink)  
Antiguo 12/02/2003, 15:55
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 23 años, 3 meses
Puntos: 5
Bueno, para solucionar la cantidad de coincidencias que muestra, solo haz este cambio:

<%
Function Cambia(ElTexto,LaBusqueda)
Dim Expresion, Patron, Cuenta
Set Expresion= New RegExp
Expresion.Pattern = ("((\S+\s+){0,5})("&LaBusqueda&"[\.,:;]*)((\s+\S+){0,5})")
Expresion.IgnoreCase = True
Expresion.Global = True
Set Matches=Expresion.Execute(ElTexto)
Cuenta=1
For Each Match in Matches
If Cuenta <3 Then 'OJO: Aqui puedes cambiar el valor para decidir cuantas coincidencias muestre
ElResultado = ElResultado& "..."& Match.Value & "... <br>"
End If
Cuenta=Cuenta+1
Next
Cambia = ElResultado
End Function


Dim Texto
Texto="El Tren: Muchos perros han caminado por este sendero triste y desolado, donde el tren pasa todas las mañanas haciendo un ruido insoportable que despierta hasta a don José, el simple sonido de el tren"

Response.write (Cambia(Texto,"tren"))
%>


Nota que tal como lo estoy poniendo, solo muestra 2 coincidencias
__________________
Manoloweb
  #14 (permalink)  
Antiguo 12/02/2003, 16:43
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 23 años, 3 meses
Puntos: 5
Con respecto a lograr que funcione aun cuando pongas la variable "o" en lugar de "y"...

Me imagino que tu script hace esto:

Si es "y" te entrega una cadena con la busqueda completa

Si es "o" te entrega un array con las diferentes palabras


En ese caso lo unico que debes hacer es lograr que la variable "LaBusqueda" te separe con | todas las palabras buscadas.

Te explico:

Cadena de busqueda= "sierra nevada en invierno"

con "y" queda así: LaBusqueda="sierra nevada en invierno"

con "o" debería quedar asi: LaBusqueda="sierra|nevada|en|invierno"

Con esto lograrías que te encuentre frases donde exista cualquiera de las palabras.

Puedes usar un "Join" o algo asi...


Saludos.

(Lo de las negritas te lo paso mas tarde)
__________________
Manoloweb
  #15 (permalink)  
Antiguo 13/02/2003, 09:54
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 23 años, 2 meses
Puntos: 2
Gracias de nuevo por tu interés y ayuda Manoloweb. :cantar:

Ya he aplicado en granadalinks.com los cambios para que muestre un máximo de 8 coincidencias de cadenas de texto con la palabra buscada.

Lo de que funcione con el booleano "o" ya me va a costar más trabajo, he estado repasando el código y haciendo cambios pero no consigo hacerlo funcionar bien.

Y lo de las negritas estaría muy bien si lo terminas sacando. Yo lo he intentado pero no lo consigo.
  #16 (permalink)  
Antiguo 13/02/2003, 09:58
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 23 años, 3 meses
Puntos: 5
Hola...

Por que no posteas las lineas de código con las que tu script recibe y procesa las palabras del input... probablemente pueda ayudarte con el booleano..

__________________
Manoloweb
  #17 (permalink)  
Antiguo 13/02/2003, 10:25
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 23 años, 3 meses
Puntos: 5
Prueba esto... te va a solucionar tus tres dudas...

<%
Function Cambia(ElTexto,LaBusqueda)
Dim Expresion, Patron, Cuenta
Set Expresion= New RegExp
Expresion.Pattern = ("((\S+\s+){0,5})("&LaBusqueda&"[\.,:;]*)((\s+\S+){0,5})")
Expresion.IgnoreCase = True
Expresion.Global = True
Set Matches=Expresion.Execute(ElTexto)
Cuenta=1
For Each Match in Matches
If Cuenta <9 Then
ElResultado = ElResultado& "..."& Match.Value & "... <br>"
End If
Cuenta=Cuenta+1
Next
Cambia = ElResultado
End Function


Function Negritas(ElTexto,LaBusqueda)
Dim Expresion
Set Expresion= New RegExp
Expresion.Pattern = ("("&LaBusqueda&"[\.,:;]*)")
Expresion.IgnoreCase = True
Expresion.Global = True
Set Matches=Expresion.Execute(ElTexto)
For Each Match in Matches
ElResultado = Expresion.Replace (ElTexto, "<b>$1</b>")
Next
Negritas = ElResultado
End Function

Dim Texto
Texto="El Tren: Muchos perros han caminado por este sendero triste y desolado, donde el tren pasa todas las mañanas haciendo un ruido insoportable que despierta hasta a don José, el simple sonido de el tren"
NuevoTexto=Cambia(Texto,"(tren|don)")

Response.write Negritas(NuevoTexto,"(tren|don)")
%>
__________________
Manoloweb
  #18 (permalink)  
Antiguo 13/02/2003, 12:05
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 23 años, 2 meses
Puntos: 2
No me funciona lo de las negritas. No sé que hago mal.

Este es el código del buscador de granadalinks.com, simplificando. Como dije antes, el original procede de webwizguide:

Código:
'Read in all the search words into one variable
strSearchKeywords = Trim(Request.QueryString("search"))

'If the use has not entered a value then let the search words variable contain a space (chr10)
If strSearchKeywords = "" Then strSearchKeywords = chr(10)

'Replace any less than or greater than signs with the HTML equivalent (stops people entering HTML tags)
strSearchKeywords = Replace(strSearchKeywords, "<", "&lt;")
strSearchKeywords = Replace(strSearchKeywords, ">", "&gt;")
strSearchKeywords = Replace(strSearchKeywords, "'", "''")

'Read in the search words to be searched
sarySearchWord = Split(Trim(strSearchKeywords), " ")

'Return the tow '' back to one' for displaying on the screen
strSearchKeywords = Replace(strSearchKeywords, "''", "'")
'Este strSearchKeywords es la variable que utilizo luego en el código de Manoloweb 


'Create a recordset object
Set rsSearchResults = Server.CreateObject("ADODB.Recordset")

'Aquí divido el código: búsqueda de webs (tipo=webs) o de fotonoticias (tipo=fotosemana). Este último es el que nos interesa: 
Select Case Request.QueryString("tipo")

Case "links"
'......

Case "fotosemana"

	strSQL = "SELECT tblFotosemana.* FROM tblFotosemana "

'Get the mode to decide how we are going to buid the SQL Query
Select Case Request.QueryString("mode")

	'If the user has selected to search any words then intalise the strSQL statement to search for any words in the database
	Case "anywords"


		'Search for the first search word in the URL titles
		strSQL = strSQL & "WHERE Titular LIKE '%" & sarySearchWord(0) & "%'"
	
		'Loop to search for each search word entered by the user
		For intSQLLoopCounter = 0 To UBound(sarySearchWord)
			strSQL = strSQL & " OR Titular LIKE '%" & sarySearchWord(intSQLLoopCounter) & "%'"
			strSQL = strSQL & " OR Antetitulo LIKE '%" & sarySearchWord(intSQLLoopCounter) & "%'" 
			strSQL = strSQL & " OR Cuerpo LIKE '%" & sarySearchWord(intSQLLoopCounter) & "%'"
			strSQL = strSQL & " OR Piedefoto LIKE '%" & sarySearchWord(intSQLLoopCounter) & "%'"
			strSQL = strSQL & " OR Fuente LIKE '%" & sarySearchWord(intSQLLoopCounter) & "%'"
		Next
		
		'Order the search results 
		strSQL = strSQL & " ORDER By id DESC;"


	'If the user has selected to search for all words then intalise the strSQL statement to search for entries containing all the search words
	Case "allwords"
	
		'Search for the first word in the Titular		strSQL = strSQL & "WHERE (Titular LIKE '%" & sarySearchWord(0) & "%'"
		
		'Loop to search the URL titles for each word to be searched
		For intSQLLoopCounter = 1 To UBound(sarySearchWord)
			strSQL = strSQL & " AND Titular LIKE '%" & sarySearchWord(intSQLLoopCounter) & "%'"
		Next
		
		
		'OR if the search words are in the Cuerpo
		strSQL = strSQL & ") OR (Cuerpo LIKE '%" & sarySearchWord(0) & "%'"
		
		'Loop to search the URL URL for each word to be searched
		For intSQLLoopCounter = 1 To UBound(sarySearchWord)
			strSQL = strSQL & " AND Cuerpo LIKE '%" & sarySearchWord(intSQLLoopCounter) & "%'"
		
		Next
		
		'Or if the search words are in the piedefoto	
		strSQL = strSQL & ") OR (Piedefoto LIKE '%" & sarySearchWord(0) & "%'"
		
		'Loop to search the URL description for each word to be searched
		For intSQLLoopCounter = 1 To UBound(sarySearchWord)
			strSQL = strSQL & " AND Piedefoto LIKE '%" & sarySearchWord(intSQLLoopCounter) & "%'"
		Next

		
	
		'Order the search results 		strSQL = strSQL & ") ORDER By id DESC;"



End Select

End Select

'Query the database with the strSQL statement
rsSearchResults.Open strSQL, strCon, 3

'Count the number of records found
lngTotalRecordsFound = CLng(rsSearchResults.RecordCount)

'..........

'Ahora viene la parte de los Response.Write

Select Case Request.QueryString("tipo")

Case "links"

'....

Case "fotosemana"

'aqui incluyo la funtion de  tu codigo, aunque como te comenté lo de las negritas no funciona

Function Cambia(ElTexto,LaBusqueda)
Dim Expresion, Patron, Cuenta, Matches, Match, ElResultado
Set Expresion= New RegExp
Expresion.Pattern = ("((\S+\s+){0,5})("&LaBusqueda&"[\.,:;]*)((\s+\S+){0,5})")
Expresion.IgnoreCase = True   
Expresion.Global = True   
Set Matches=Expresion.Execute(ElTexto)
   Cuenta=1
   For Each Match in Matches
   If Cuenta <9 Then 'OJO: Aqui puedes cambiar el valor para decidir cuantas coincidencias muestre
      ElResultado = ElResultado& "..."& Match.Value & "... <br>"
   End If
   Cuenta=Cuenta+1
   Next
   Cambia = ElResultado
End Function

Function Negritas(ElTexto,LaBusqueda)
Dim Expresion
Set Expresion= New RegExp
Expresion.Pattern = ("("&LaBusqueda&"[\.,:;]*)")
Expresion.IgnoreCase = True 
Expresion.Global = True 
Set Matches=Expresion.Execute(ElTexto)
For Each Match in Matches 
ElResultado = Expresion.Replace (ElTexto, "<b>$1</b>")
Next
Negritas = ElResultado
End Function

'aqui sigue el codigo original
If NOT Request.QueryString("mode") = "" Then 

		'For....Next Loop to display the results from the database
		For intRecordLoopCounter = 1 to intRecordsPerPage
		
			'If there are no records left to display then exit loop
			If rsSearchResults.EOF Then Exit For					
		      	
		     'aqui muestro la foto, el titular y, adapto el código de Manoloweb para que muestre las cadenas de texto con la palabra buscada		

						 Response.Write vbCrLf & "  	<a href=""fotosemanaa.asp?id=" & rsSearchResults("id") & """><img style=""margin-right: 5px;"" border=0 src="" "& rsSearchResults("URLp") & """ width="" "& rsSearchResults("widthp") & """ height="" "& rsSearchResults("heightp") & """></a>
		    Response.Write vbCrLf & " 	    <a href=""fotosemanaa.asp?id="  & rsSearchResults("id") & """>" & rsSearchResults("Fecha") & " .&#45 " & rsSearchResults("Titular") & "</a>"
			 
			  'RESPONSE.WRITE DE MANOLOWEB
			  Dim Texto
			  Texto=rsSearchResults("Cuerpo") 
 			  Response.Write vbCrLf & "<p class=normal>" & (Cambia(Texto,strSearchKeywords )) & "</td>"
			  
	   	
		'Move to the next record in the database
			rsSearchResults.MoveNext
		
		'Loop back round   	
		Next

End If

Última edición por mrgubu; 13/02/2003 a las 12:07
  #19 (permalink)  
Antiguo 13/02/2003, 12:28
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 23 años, 3 meses
Puntos: 5
Bien, ya vi la solucion... solo dejame trabajarla un poco... si puedes esperate en linea para que lo pruebes...
__________________
Manoloweb
  #20 (permalink)  
Antiguo 13/02/2003, 12:38
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 23 años, 3 meses
Puntos: 5
Aqui te lo dejo... Creo que debe funcionarte

<%
'Read in all the search words into one variable
strSearchKeywords = Trim(Request.QueryString("search"))

'If the use has not entered a value then let the search words variable contain a space (chr10)
If strSearchKeywords = "" Then strSearchKeywords = chr(10)

'Replace any less than or greater than signs with the HTML equivalent (stops people entering HTML tags)
strSearchKeywords = Replace(strSearchKeywords, "<", "&lt;")
strSearchKeywords = Replace(strSearchKeywords, ">", "&gt;")
strSearchKeywords = Replace(strSearchKeywords, "'", "''")

'Read in the search words to be searched
sarySearchWord = Split(Trim(strSearchKeywords), " ")
TuBusqueda=Join(sarySearchWord,"|") '<--------FIJATE AQUI!!

'Return the tow '' back to one' for displaying on the screen
strSearchKeywords = Replace(strSearchKeywords, "''", "'")
'Este strSearchKeywords es la variable que utilizo luego en el código de Manoloweb


'Create a recordset object
Set rsSearchResults = Server.CreateObject("ADODB.Recordset")

'Aquí divido el código: búsqueda de webs (tipo=webs) o de fotonoticias (tipo=fotosemana). Este último es el que nos interesa:
Select Case Request.QueryString("tipo")

Case "links"
'......

Case "fotosemana"

strSQL = "SELECT tblFotosemana.* FROM tblFotosemana "

'Get the mode to decide how we are going to buid the SQL Query
Select Case Request.QueryString("mode")

'If the user has selected to search any words then intalise the strSQL statement to search for any words in the database
Case "anywords"


'Search for the first search word in the URL titles
strSQL = strSQL & "WHERE Titular LIKE '%" & sarySearchWord(0) & "%'"

'Loop to search for each search word entered by the user
For intSQLLoopCounter = 0 To UBound(sarySearchWord)
strSQL = strSQL & " OR Titular LIKE '%" & sarySearchWord(intSQLLoopCounter) & "%'"
strSQL = strSQL & " OR Antetitulo LIKE '%" & sarySearchWord(intSQLLoopCounter) & "%'"
strSQL = strSQL & " OR Cuerpo LIKE '%" & sarySearchWord(intSQLLoopCounter) & "%'"
strSQL = strSQL & " OR Piedefoto LIKE '%" & sarySearchWord(intSQLLoopCounter) & "%'"
strSQL = strSQL & " OR Fuente LIKE '%" & sarySearchWord(intSQLLoopCounter) & "%'"
Next

'Order the search results
strSQL = strSQL & " ORDER By id DESC;"


'If the user has selected to search for all words then intalise the strSQL statement to search for entries containing all the search words
Case "allwords"

'Search for the first word in the Titular strSQL = strSQL & "WHERE (Titular LIKE '%" & sarySearchWord(0) & "%'"

'Loop to search the URL titles for each word to be searched
For intSQLLoopCounter = 1 To UBound(sarySearchWord)
strSQL = strSQL & " AND Titular LIKE '%" & sarySearchWord(intSQLLoopCounter) & "%'"
Next


'OR if the search words are in the Cuerpo
strSQL = strSQL & ") OR (Cuerpo LIKE '%" & sarySearchWord(0) & "%'"

'Loop to search the URL URL for each word to be searched
For intSQLLoopCounter = 1 To UBound(sarySearchWord)
strSQL = strSQL & " AND Cuerpo LIKE '%" & sarySearchWord(intSQLLoopCounter) & "%'"

Next

'Or if the search words are in the piedefoto
strSQL = strSQL & ") OR (Piedefoto LIKE '%" & sarySearchWord(0) & "%'"

'Loop to search the URL description for each word to be searched
For intSQLLoopCounter = 1 To UBound(sarySearchWord)
strSQL = strSQL & " AND Piedefoto LIKE '%" & sarySearchWord(intSQLLoopCounter) & "%'"
Next



'Order the search results strSQL = strSQL & ") ORDER By id DESC;"



End Select

End Select

'Query the database with the strSQL statement
rsSearchResults.Open strSQL, strCon, 3

'Count the number of records found
lngTotalRecordsFound = CLng(rsSearchResults.RecordCount)

'..........

'Ahora viene la parte de los Response.Write

Select Case Request.QueryString("tipo")

Case "links"

'....

Case "fotosemana"

'aqui incluyo la funtion de tu codigo, aunque como te comenté lo de las negritas no funciona

Function Cambia(ElTexto,LaBusqueda)
Dim Expresion, Patron, Cuenta, Matches, Match, ElResultado
Set Expresion= New RegExp
Expresion.Pattern = ("((\S+\s+){0,5})("&LaBusqueda&"[\.,:;]*)((\s+\S+){0,5})")
Expresion.IgnoreCase = True
Expresion.Global = True
Set Matches=Expresion.Execute(ElTexto)
Cuenta=1
For Each Match in Matches
If Cuenta <9 Then 'OJO: Aqui puedes cambiar el valor para decidir cuantas coincidencias muestre
ElResultado = ElResultado& "..."& Match.Value & "... <br>"
End If
Cuenta=Cuenta+1
Next
Cambia = ElResultado
End Function
<%
Function Negritas(ElTexto,LaBusqueda)
Dim Expresion
Set Expresion= New RegExp
Expresion.Pattern = ("("&LaBusqueda&"[\.,:;]*)")
Expresion.IgnoreCase = True
Expresion.Global = True
Set Matches=Expresion.Execute(ElTexto)
For Each Match in Matches
ElResultado = Expresion.Replace (ElTexto, "<b>$1</b>")
Next
Negritas = ElResultado
End Function

'aqui sigue el codigo original
If NOT Request.QueryString("mode") = "" Then

'For....Next Loop to display the results from the database
For intRecordLoopCounter = 1 to intRecordsPerPage

'If there are no records left to display then exit loop
If rsSearchResults.EOF Then Exit For

'aqui muestro la foto, el titular y, adapto el código de Manoloweb para que muestre las cadenas de texto con la palabra buscada

Response.Write vbCrLf & " <a href=""fotosemanaa.asp?id=" & rsSearchResults("id") & """><img style=""margin-right: 5px;"" border=0 src="" "& rsSearchResults("URLp") & """ width="" "& rsSearchResults("widthp") & """ height="" "& rsSearchResults("heightp") & """></a>
Response.Write vbCrLf & " <a href=""fotosemanaa.asp?id=" & rsSearchResults("id") & """>" & rsSearchResults("Fecha") & " .- " & rsSearchResults("Titular") & "</a>"

'RESPONSE.WRITE DE MANOLOWEB
Dim Texto
Texto=rsSearchResults("Cuerpo")
NuevoTexto=Cambia(Texto,TuBusqueda )
Response.Write vbCrLf & "<p class=normal>" & (Negritas(NuevoTexto,TuBusqueda )) & "</td>"


'Move to the next record in the database
rsSearchResults.MoveNext

'Loop back round
Next

End If
%>
__________________
Manoloweb
  #21 (permalink)  
Antiguo 13/02/2003, 13:50
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 23 años, 2 meses
Puntos: 2
Cooohonudo Manoloweb. ¡Vaya trabajo más fino!

Ahora sí que mola mi buscador de fotonoticias(http://granadalinks.com ).

Mis aspiraciones de mejorar el código de mi web cuando posteé este tema era bastante modestas. No podía ni imaginar una colaboración tan fabulosa como la de Manoloweb. :cantar:

Estoooo..., Manoloweb, teniendo en cuenta el pedaso de control que tienes sobre ASP y que ya has leído el código de mi buscador voy a pedirte una cosa más, que no creo que te cueste mucho trabajo....

¿Como podría hacer que mi buscador, además de tener las opciones de "y" y de "o", tuviera una tercera opción: buscar la frase completa ?

Yo he hecho algunos intentos pero nunca lo he conseguido.

Desde luego incluyendo esta última opción, mi buscador sería casi (o sin casi) perfecto.

Además, creo que es un tema interesante y podría interesar a mucha gente.

Gracias una vez más Manoloweb.
  #22 (permalink)  
Antiguo 13/02/2003, 14:07
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 23 años, 3 meses
Puntos: 5
Je je!!! ahora me doy cuenta de algo...

Tu busqueda actual te esta buscando siempre como "o"

Para que pueda ser "y" deberemos hacer otra pieza de código mas compleja :

Para hacerla "frase completa" deberás cambiar (con un Select Case, por ejemplo) el

Join(sarySearchWord,"|")

por

Join(sarySearchWord," ")

Implementando este cambio, tendrás una busqueda con "o" o con "frase completa"... Dejame pensar la solucion más facil para lograr que funcione el "y".

Saludos
__________________
Manoloweb
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 12:11.