Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-04-2005
Avatar de JuanBCT
JuanBCT JuanBCT is offline
Miembro
 
Registrado: ago 2004
Ubicación: Campana, Argentina
Posts: 57
Poder: 20
JuanBCT Va por buen camino
Búsqueda muy específica en un string...

Hola! Les quería comentar acerca de un problemita que tengo, a ver si alguien me puede ayudar...

Hice una conversión de un RTF de un DBRichEdit a HTML, con una librería freeware que encontré por ahí. Me dí cuenta que tiene un par de errores, por lo que una vez que la grabo la cargo en un RichEdit auxiliar y la recorro corrigiendo errores.
Creía que ya lo tenía pero me dí cuenta que si uno quiere comenzar una línea con un espacio, a leer el HTML éste es obviado.

O sea, si yo tengo:
Código:
<B><I><U><FONT COLOR="#000000"><FONT FACE="Tahoma">
<FONT SIZE=-2> Sector Programación</FONT>
</FONT></FONT></U></I></B><BR>

...me va a tirar la frase "Sector programación" totalmente alineada a la izquierda, a pesar del espacio entre ">" y "S".

Averiguando, encontré que si uno reemplaza dicho espacio con "&nbsp", se convierte en un espacio tenido en cuenta. El código quedaría así:
Código:
<B><I><U><FONT COLOR="#000000"><FONT FACE="Tahoma">
<FONT SIZE=-2>&nbspSector programación</FONT>
</FONT></FONT></U></I></B><BR>

Bien, ahora lo que yo pretendo es corregir esto por código; cargo cada línea como un String y busco, el tema es que si pongo "reemplazar cada ' ' por '&nbsp'; se metería por ejemplo entre FONT COLOR, FONT FACE, etc... por lo que dejaría de funcionar bien el código. Esto lo haría así:
Código:
SS:=StringReplace(SS, ' ','&nbsp', [rfReplaceAll, rfIgnoreCase]);
Mi pregunta es: ¿cómo hago para realizar el reemplazo anterior pero limitando la búsqueda sólo en el texto? Estaba pensando que puedo hacer algo como "buscar sólo en lo que haya entre un > y un <", ya que salvo el texto en sí en todo lo demás que cumple esa condición no hay nada....

Bueno, espero que alguien me pueda ayudar; disculpen que el mensaje sea tan largo! Traté de ser lo más específico posible...
Un saludo, y desde ya muchas gracias.

Juan

Última edición por JuanBCT fecha: 22-04-2005 a las 17:16:48. Razón: Ocupaba muchas pantallas horizontales
Responder Con Cita
  #2  
Antiguo 22-04-2005
Ing_Fajardo Ing_Fajardo is offline
Miembro
 
Registrado: abr 2005
Ubicación: Mexico
Posts: 46
Poder: 0
Ing_Fajardo Va por buen camino
Lo primero que te recomendaria es conseguir otro vcl que te ayude con esto.

Si no tienes de otra, pues ni modo, por programacion tienes que sustituir los espacios siempre sean etiquetas que aparecerán en las paginas.

Saludos.
Responder Con Cita
  #3  
Antiguo 22-04-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por Ing_Fajardo
Si no tienes de otra, pues ni modo, por programacion tienes que sustituir los espacios siempre sean etiquetas que aparecerán en las paginas.

Saludos.
Pues creo que si se puede hacer, ya que todos los códigos de control, van
encerrados justamente al contrario de lo que se busca.

Ejemplo:
Código:
<FONT COLOR="#000000">   no entraría en el If por la primera condición.

><I><U> tampoco entra,
 por la segunda condición (no hay caracteres entre los 2 primeros símbolos).
 Aqui tienes que perfilar la rutina, para que quite los dos caracteres iniciales y 
 siga analizando la misma cadena
Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 22-04-2005 a las 17:57:16.
Responder Con Cita
  #4  
Antiguo 22-04-2005
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Te recomiendo ABSOLUTAMENTE mirar la posibilidad de usar Expresiones Regulares... que son basicamente, instrucciones muy poderosas de busqueda y reemplazo de cadenas.

Por ejemplo, ayer necesitaba pasar todos los codigos que eran

i := 0;
while i < Algo.Count do

por

for i:=0 to Algo.Count-1 do

y con expresiones regulares se hacen en dos-3 lineas de codigo. Especialmente al lidiar con HTML son muy valiosas y de hecho, una razon por la cual es popular PHP es al soporte nativo que le da a esto.

Sin esta ayuda, la veo dificil, porque lo que necesitas es armar un parser o meter mucha logica para cubrir todos los casos...

Puedes ver una lista de funciones prefabricadas en http://www.regexlib.com/. Si te suena la idea bajate el programa "The Regulator" es gratuito y sirve para armar las expresiones.

Sin embargo, ten en cuenta que es un poco dificil de entender al principio y que necesitar bajarte una libreria de estas para Delphi (porque no la trae nativamente)...

Pero te recomiendo esta ruta, porque el problema que estas teniendo, no te preocupes, saldran mas
__________________
El malabarista.
Responder Con Cita
  #5  
Antiguo 22-04-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hoy vengo de pesimista y digo que esto es una tarea cuasi imposible.

Para empezar aclaremos que no se trata de un error de la librería mencionada sino que es inherente a la naturaleza del HTML.

Por otra parte, aún evitando colocar la secuencia &nbsp; en los espacios entre parámetros de una etiqueta, ¿qué pasa con todos los demás espacios? Los espacios normales entre palabras. Dirán ustedes, bueno, ¡qué importa! de cualquier manera son espacios que deben aparecer en la representación visual. Sí, pero además de saturar el archivo HTML con caracteres innecesarios con el consecuente aumento en el tiempo de descarga, no olvidemos que &nbsp;viene de non breaking space, es decir un espacio que impedirá que se corte la línea de salida, así que todo el contenido del archivo HTML se verá en una sóla línea (al menos grandes partes hasta no encontrarse una etiqueta que obligue al cambio de párrafo como <p>).

Digo cuasi imposible porque todo es posible, pero lo veo muy difícil tan sólo con las herramientas de Delphi. La mejor opción será la que (ahora veo que ya lo indica mamcx) el uso de un analizador de expresiones regulares (y el estudio de éstas, pues no creo que la expresión regular necesaria sea tan fácil)

// Saludos
Responder Con Cita
  #6  
Antiguo 22-04-2005
Avatar de JuanBCT
JuanBCT JuanBCT is offline
Miembro
 
Registrado: ago 2004
Ubicación: Campana, Argentina
Posts: 57
Poder: 20
JuanBCT Va por buen camino
Hola, les agradezco por responder tan rápido; si bien no solucioné el problema me voy orientando más...

Cita:
Empezado por Roman
Por otra parte, aún evitando colocar la secuencia &nbsp; en los espacios entre parámetros de una etiqueta, ¿qué pasa con todos los demás espacios? Los espacios normales entre palabras. Dirán ustedes, bueno, ¡qué importa! de cualquier manera son espacios que deben aparecer en la representación visual. Sí, pero además de saturar el archivo HTML con caracteres innecesarios con el consecuente aumento en el tiempo de descarga, no olvidemos que &nbsp;viene de non breaking space, es decir un espacio que impedirá que se corte la línea de salida, así que todo el contenido del archivo HTML se verá en una sóla línea (al menos grandes partes hasta no encontrarse una etiqueta que obligue al cambio de párrafo como <p>).
No podría hacer algo así: "Ubicar lo que está después de un > HASTA el 1er caracter <> a ' ' Y de longitud>0"

Luego, esto lo paso a otro string (ej: STEMP) y ejecuto:

Código:
STEMP:=StringReplace(STEMP, ' ','&nbsp', [rfReplaceAll, rfIgnoreCase]);
... y esto que obtengo lo reemplazo en el string que leí originalmente...

Creo que de esta manera: 1) Evito poner los &nbsp en los espacios entre las etiquetas
2) Evito poner &nbsp innecesarios, porque teóricamente el string temporal tendría que estar cargado con espacios, o nada si el texto está totalmente contra el margen....

Bueno, voy a ver si lo pruebo; les voy a agradecer cualquier comentario/ayuda al respecto...

Saludos!!!
Responder Con Cita
  #7  
Antiguo 22-04-2005
Elfoscuro Elfoscuro is offline
Miembro
 
Registrado: mar 2005
Posts: 59
Poder: 20
Elfoscuro Va por buen camino
Yo lo que haría sería:

Lees y si encuentras un '<', avanzas hasta que encuentres un '>'.

Empiezas a pasar chars a una string temporal hasta que vuelvas a encontrar un '<'.

Si la cadena es diferente de '', entonces miro el primer char, y si es espacio, lo sustituyo.

******** Pregunta: la cadena '&nbsp; algo' ¿ya serviría? Es decir, que si el primer char no es un espacio, ¿el HTML muestra lo que haya, íntegro?

Después añades a la salida la cadena temporal y sigues.

Un saludo
Responder Con Cita
  #8  
Antiguo 22-04-2005
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
A lo que vengo es que estas es haciendo un PARSER. Si eso es complicado, de hacerlo manualmente.

El punto es que el HTML (asi como el C++) son muy dificiles de parsear. Hay muchas formas en como las supociciones se convierten en problemas. Nada te garantiza que el html siga exactamente lo que uno piensa. Aun cuando un programa lo genera, vaya uno a saber si DOS veces y SIEMPRE hara lo mismo. En el momento que pase:

Código PHP:
 <FONT SIZE=-2 bgcolor=FFFF>  //otros atributos
 
Sector programación</FONT>
 
 <
FONT SIZE=-2>  Sector programación</FONT//dos espacios
 
 
<FONT SIZE=-2
 
Sector programación</FONT
 
 <
FONT SIZE=-2
  
Sector programación</FONT
 
 <
FONT SIZE=-2>&nspSector programación</FONT//meteria un espacio mas
 
 
<FONT> </FONT//una etiqueta vacia
 
<FONTSector >programación <-- comentario html --/></FONT
y aunque en fin, tal vez me estoy imaginando los problemas, en armar parsers SOLO se deben cubrir los casos VALIDOS y olvidar los invalidos.

De hecho, la logica de lo que piensas hacer es mas o menos:

Detectar las etiquetas FONT, ir al caracter de cierre, mirar si hay espacios, insertar los caracteres.

Me tome la molestia de armar una expresion regular y ademas te la explico:

Código PHP:
 \<FONT(?<atributos>.*)\>(?<espacio>\s)+(?<titulo>.+)\<\/FONT\> 
Cita:
\< = detectar a "<" tal cual (es como evitar que se cojan los comandos / caracteres reservados del lenguaje de expresiones regulares

FONT
= Detectar la secuencia exacta de caracteres FONT

(?<atributos>.*) = Realizar una captura con el nombre atributos
.* =Cualquier secuencia de caracteres con espacios y todo

\> = detectar a ">" tal cual

(?<espacio>\s) = Realizar una captura con el nombre espacio
\s = Detecta un espacio

+ = La captura anterior, ejecutarla por lo menos por un espacio detectado hasta cuantos espacios existan

(?<titulo>.+) = Realizar una captura con el nombre titulo
.+ = Cualquier secuencia de caracteres que sea encontrada AL MENOS una vez
Como vez, un monton de logica de programacion condensada en una linea de codigo

Para reemplazar:

Código PHP:
 <FONT ${atributos}>&nbsp${titulo}</FONT
Esta expresion cubre MUCHAS mas posibilidades que el codigo que estabas planteando, aunque de los ejemplos que te mostre no cojeria si hay un ENTER entre los caracteres del titulo. Por ejemplo captura

Código PHP:
 <FONT  SIZE=-2Sector programación/FONT>
 <
FONT  SIZE=-2>                     Sector programación/FONT>
 <
FONTSector programación/FONT>
 <
FONT>            Sector >programación</FONT
pero no:

Código PHP:
 <FONT  SIZE=-2 bgcolor=FFFF>&nbspSector programación/FONT>
 <
FONT  
 
<FONT  SIZE=-2 bgcolor=FFFFSector programaciónFONT>
 <
FONT>Sector programación</FONT//Si quieres que esta la coja, cambia + por * despues de captura con nombre espacio 
Todavia quedan varios casos por fuera, pero es la idea...
__________________
El malabarista.
Responder Con Cita
  #9  
Antiguo 22-04-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Basicamente puedes usar 2 variables:
- PosMayor (posición del simbolo Mayor)
- PosMenor, (posición del simbolo menor)

Junto con la funcion Pos de delphi.
en un Stringlist cargas toda la pagina web

Código Delphi [-]
stringactual :='< FONT  SIZE=-2  >Sector programación<  /FONT>';

PosMayor := pos('>',stringactual);
PosMenor := pos('<',stringactual);
while (PosMayor <  PosMenor) and (trim(copy(stringactual,posMayor, posMenor-PosMayor))<>'' do
begin
 // insertas el  "&nbsp", justo despues de PosMayor
 // guardas la cadena modificada en otra variable.
 // stringactual := copy(stringactual,posMenor,255); 
// seguimos con el resto de la cadena
end

Useasé, entre un carácter '>' y otro '<' debe existir alguna letra, y además distinto de espacios vacios.

Deberás perfilarlo un poco más, quitando saltos de linea si existen....pero creo que te servirá.

Un saludo
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 16:31:34.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi