FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Extraer tokens estilo <Tag>
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Extraer tokens estilo <Tag>
Posted: Tue Dec 17, 2013 11:13 AM

Pues eso. Teniendo una cadena tal que asi:

"Nombre: <Tag_desconocido1> Apellidos <Tag_desconocido2>"

Necesito extraer <Tag_desconocido1> y <Tag_desconocido2> o guardarlos en un array.

¿ Tendria que ser recorriendo la cadena ? ¿ alguna funcion tipo token para ello ?

Gracias

Posts: 989
Joined: Thu Nov 24, 2005 03:01 PM
Re: Extraer tokens estilo &lt;Tag&gt;
Posted: Tue Dec 17, 2013 05:14 PM

Hola hmpaquito,

imagina que partimos la cadena usando '>' como separador. No uso hb_atokens, pero creo que hb_atokens( cString, '>' ) me da un array de elementos que, a excepción del último, terminan en algo así como 'algo<tagN", por lo que usando rat() en cada elemento hasta el penúltimo podrás extraer los tags que estas buscando.
Espero haberme explicado. Un saludo

Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Extraer tokens estilo &lt;Tag&gt;
Posted: Tue Dec 17, 2013 05:58 PM
Carlos,

Te agradezco tu interés.
Yo buscaba a ver si Harbour tuviera una funcion que directamente hiciera eso: una funcion a la que se le pasa los delimitadores y devuelve cada ocurrencia.
A vuela pluma, he hecho esta sin probar:

Code (fw): Select all Collapse
/*
   // Ejemplo de llamada:

   // Con lo siguiente obtendremos un array con los elementos:
   // {"cable", "enchufe", "mesa", "silla"}
   cFrase:= "elementos electricos <cable> y <enchufe>. elementos de madera <mesa> y <silla>"
   aTag:= aTags(cFrase, "<", ">")
   
*/
//------------------------------------------------------//
FUNCTION aTags(cTex, cDelim1, cDelim2)
Local aTag:= {}, cTag:= NIL, i

FOR i:= 1 to Len(cTex)
   cCar:= SubStr(cTex, i, 1)
   if cCar == cDelim1 .OR. cCar == cDelim2
       IF cCar == cDelim1
           cTag:= ""
       ENDIF  
       IF cCar == cDelim2 .AND. cTag != NIL
           Aadd(aTag, cTag)
           cTag:= NIL
       ENDIF
   ELSEIF cTag != NIL
       cTag+= cCar
   endif
NEXT
RETURN aTag

Continue the discussion