Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Extraer palabras de un texto (https://www.clubdelphi.com/foros/showthread.php?t=66656)

diego007 05-03-2010 05:43:49

Extraer palabras de un texto
 
Hola amigos, e buscado en internet y no encuentro mucho sobre este tema:confused:, lo que necesito es una funcion que extraiga todas las URLs de un texto (txt), osea, seria las palabras que inicien con "h tt p://", para esto creo que es necesario expresiones regulares, pero no tengo instalado ningun componente de este tipo
Si algien tiene alguna idea de como hacerlo, le agrdesco mucho (y si fuera posible sin ningun componente extra, le agradecere mucho mas :D)

Salu2

BrunoBsso 05-03-2010 07:32:24

Hola.
Mirá, esta solución la acabo de "crear" (entre comillas porque seguro ya existe) y no se si será la más eficiente del mundo, seguro hay otra mucho mas eficiente. Pero a mí me funcionó y en definitiva eso es lo que cuenta.
Uso un TEdit para el texto, vos usá lo que necesites amoldándolo al código.
Basta de preámbulos, te paso el código que hice:
Código Delphi [-]
function EmpiezaHTTP(T:String; Indice:Integer):Boolean;
{DEVUELVE TRUE SI LA CADENA ENVIADA EMPIEZA CON HTTP}
begin
  Result:=False;
  if (LowerCase(T[Indice])='h') then
    if (LowerCase(T[Indice+1])='t') then
      if (LowerCase(T[Indice+2])='t') then
        if (LowerCase(T[Indice+3])='p') then
          if (LowerCase(T[Indice+4])=':') then
            if (LowerCase(T[Indice+5])='/') then
              if (LowerCase(T[Indice+6])='/') then
                Result:=True;
end;

procedure StrListToMemo(var Memo:TMemo; StrList:TStringList);
{ESTE PROC ALMACENA EL CONTENIDO DE UN TStringList EN UN TMemo}
var
  I:Integer;
begin
  for I := 0 to StrList.Count - 1 do
    Memo.Lines.Append(StrList.Strings[i]);
end;

procedure TForm1.Button1Click(Sender: TObject);
{LO HAGO CON UN TEdit PARA SIMPLIFICARLO, VOS DESPUÉS ACOMODALO A TU GUSTO}
{GUARDO TODAS LAS URLs EN UN TMemo}
var
  ListaURLs:TStringList; //Acá vamos a guardar todas las URLs que encontremos
  StrAuxiliar:String; //Acá almacenamos el string que sería una URL
  I:Integer;
begin
  ListaURLs:=TStringList.Create;
  I:=1;
  while (I<=Length(Edit1.Text)) do begin
    StrAuxiliar:='';
    if (EmpiezaHTTP(Edit1.Text,I)) then begin
      CantMovimientos:=0;
      while (Edit1.Text[i]<>' ') do begin //En la condición, el espacio en blanco es el final del string para la URL
        StrAuxiliar:=StrAuxiliar+Edit1.Text[i];
        I:=I+1;
      end;
      ListaURLs.Append(StrAuxiliar);
    end;
    I:=I+1;
  end;
  StrListToMemo(Memo1,ListaURLs);
end;

Y así como funciona:


Espero que te sea útil, que te de la solución que necesitás.
Si alguien tiene una mejor, o una función que haga esto mismo, que la escriba así yo también aprendo :)
Saludos!

DriverOp 05-03-2010 10:30:03

Tengo una unidad para expresiones regulares llamada TRegExpr hechas por un ruso (Andrey V. Sorokin), es la única clase que encontré en su tipo. Funciona bien pero para textos grandes es terriblemente lento.

BrunoBsso 05-03-2010 11:49:23

Tambien se me ocurre que con un Pos podrías verificar si tiene un http. Si Pos te da -1, entonces no tiene http el string que le pasaste.
Ni ganas de hacerlo ahora, pero después me voy a fijar.
Saludos!

diego007 05-03-2010 17:38:36

Gracias por su ayuda
 
Hola Bruno, muchas gracias por tu ayuda, el codigo si trabaja bien, pero solo con textos pequeños, ya con textos grandes se demora una eternida :D
e leido un poco sobre la funcion Post vi que era para encontrar palabras, aqui un ejemplo:
Código PHP:

var string;
    
integer;
s:='DELPHI PROGRAMMING';
i:=Pos('HI PR',s); 

mi pregunta es como se podria hacer para que cuando la encuentre, copie toda la URL?

BrunoBsso 05-03-2010 19:47:36

Hola Diego.
La función Pos te devuelve el índice donde empieza el sustring que estás buscando.
Supongamos que en "DELPHI PROGRAMMING" estás buscando HI PR.
Pos te va a devolver 5. Lo único que te faltaría sería revisar si desde I=5 hasta I+4 el texto = 'HI PR'.
Código Delphi [-]
S,Aux:String;
I,P:Integer;
Es_HI_PR:boolean;
P:=Pos('HI PR', s);
for I:=P to P+4
  Aux:=Aux+S[i];
Es_HI_PR:=Aux='HI PR';
Eso es lo que te decía anoche después de haber hecho todo el código anterior, pero me dolía la cabeza como para ponerme a teclear.
Creo que con eso funcionaría.
Saludos!

BrunoBsso 05-03-2010 21:01:22

Listo.
 
1 Archivos Adjunto(s)
No me gustó la respuesta que te di, no tiene explicación.
Así que te prepare una aplicación que usa 2 TMemo: 1 con strings que tengan o no URLs y otro que va guardando cada una de las URLs del primero (cada URL en cada línea, y si la línea tiene más de una URL también la almacena).
Es demasiado largo para ponerlo acá, así que te paso el proyecto.
Saludos!

BrunoBsso 06-03-2010 07:54:02

Bueno a ver mostro si decís si te sirvió o no... yo ya estoy pensando en otra forma de hacerlo separando en palabras toda la línea.
Necesito que me digas si con eso basta o no te sirve.
Ya 3 personas bajaron el archivo y seguramente vos sos uno.
Dame una señal de vida así dejo de diagramar otra solución ¿dale?

diego007 06-03-2010 17:46:20

Esta fue
 
Hola Bruno, gracias por tu ayuda, disculpa por no contestarte antes (El viernes es uno de los peores dias para tratar de trabajar :D) en este momento lo estoy integrando el codigo a mi programa y trabaja super bien, es muy rapido. esta era la solucion que busque desde mucho tiempo atras, de nuevo gracias

Salu2

BrunoBsso 06-03-2010 18:28:18

Buenísimo, mejor.
La otra que ya terminé de hacer es mas lenta pero más simple.
Al fin puedo dejar de teclear jajaja
Saludos!


La franja horaria es GMT +2. Ahora son las 18:07:40.

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