Avatar billede wittrup Nybegynder
20. november 2006 - 09:18 Der er 11 kommentarer og
1 løsning

Iterativ vs rekursiv

Jeg har en rekursiv funktion der stripper en tekststreng for HTML tags. Den virker som den skal men hvis tekststrengen er lang (ca. 4 A4 sider) så får jeg stack overflow.. Derfor vil jeg mene at jeg skal skrive den om til at være iterativ istedet for rekursiv..

Er der nogen her der har en ide til hvordan jeg gør det?

Her er den nuværende kode (Feel free to use it, men den crasher jo som sagt ved lange strenge)



function getClearText(textObj)
BeginTag = "<"
EndTag = ">"
FirstHit = instr(textObj,BeginTag)
if FirstHit > 0 then
    tempSt1 = mid(textObj, 1, FirstHit -1)
    SecondHit = instr(textObj,EndTag)
    StringLength = len(textObj)
    tempSt2 = mid(textObj, SecondHit +1 ,StringLength)
    testObj = tempSt1 & tempSt2
    getClearText = getClearText(testObj)
else
    getClearText = replace(textObj, ".",".&nbsp;")
end if
end function

Ps. Grunden til den sidste replace "." med ".&nbsp;" er at overskrifter ofte har ".<br>" .. så uden at skifte "." ud med ". "
ser det lidt dumt ud.
Avatar billede erikjacobsen Ekspert
20. november 2006 - 09:21 #1
Heeelt utestet:

function getClearText(textObj)
BeginTag = "<"
EndTag = ">"
FirstHit = instr(textObj,BeginTag)
while FirstHit > 0 do
    tempSt1 = mid(textObj, 1, FirstHit -1)
    SecondHit = instr(textObj,EndTag)
    StringLength = len(textObj)
    tempSt2 = mid(textObj, SecondHit +1 ,StringLength)
    textObj = tempSt1 & tempSt2
    FirstHit = instr(textObj,BeginTag)
end while
getClearText = replace(textObj, ".",".&nbsp;")
end function
Avatar billede fennec Nybegynder
20. november 2006 - 09:38 #2
Eller brug regexp:

function getClearText(textObj)
dim regEx
  set regEx = New RegExp
  regEx.IgnoreCase = True
  regEx.Global = True
  regEx.Pattern = "<[^>]*?>"
  getClearText = regEx.Replace(textObj, "")
end function
Avatar billede wittrup Nybegynder
20. november 2006 - 09:56 #3
fennec:
Kan jeg få en hurtig forklaring på regEx.Pattern = "<[^>]*?>"

Ser nice ud, men er det hurtigere end en while løkke?
Avatar billede fennec Nybegynder
20. november 2006 - 10:21 #4
Regular Expression er nok det mest kraftfulde værktøj inden for programmering. Det har desuden sin helt egne kategori her på E. Jeg har aldrig taget tid på det, men jeg er overbevist om at det er hurtigere.

Forklaring til koden:
< har ingen betydning i regexp, så er bare "<"
[^xxx] find alt som ikke er xxx
* find forgående 0 eller flere gange
? (efter et * eller +) gør * eller + ikke grådig.

Sat sammen bliver det til:
find "<[fing tegn som ikke er >]x antal gange ikke grådig>"

Jeg skal ikke kunne sige hvorfor det lige er denne der altid bruges, for det kan også skrives sådan her:
regEx.Pattern = "<.*?>"

. er alt bortset fra linjeskift, hvorfor den også bliver til:
find "<tegn som ikke er linjeskift x antal gange ikke grådig>"

RegExp kan være svært at lære, men lige pludselig ser man lyset, også kan man lave alle mulige replace og valideringer. Regexp kan nemlige også bruges til at validere bruger input (f.eks email adresser)
Avatar billede fennec Nybegynder
20. november 2006 - 10:24 #5
Jeg bruger f.eks denne funktion til at validere email adresser med:

function checkEmail(fEmail)
dim fMailRx
  Set fMailRx = New RegExp
  fMailRx.Global = True
  fMailRx.IgnoreCase = True
  fMailRx.Pattern = "^\w[\w\.\-\+]*@\w([\w\-]*\.)+\w{2}\w*$"
  checkEmail = fMailRx.test(fEmail&"")
  Set fMailRx = nothing
end function
Avatar billede wittrup Nybegynder
20. november 2006 - 12:10 #6
Det ser nice ud fennec, men jeg er godtnok i tvivl om hvordan det virker hehe.
Vi har "<[^>]*?>"
er det det inden i [] den fjerner?
Jeg skal jo have strippet alt imellem < og >.
Fjerner din kode ikke bare > ?
Avatar billede fennec Nybegynder
20. november 2006 - 12:52 #7
Nej. Man laver et Pattern (skabelon), og ud fra det kan man så vælge at lave en replace eller en test. Begge de pattern jeg har vist finde alle tags. Altså alt <xxx> også replacer man det med "", som i min funktion fra 20/11-2006 09:38:31.

Som sagt er RegExp meget indviklet, så hvis det er noget du vil lære så smut over i RegExp kategorien:
http://www.eksperten.dk/spm/Programmering/RegExp/

Du kan se en tagliste til regexp her:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/ab0766e1-7037-45ed-aa23-706f58358c0e.asp

Her er et par eks på regexp jeg lige har opfundet:
Find alle tal:
regEx.Pattern = "[0123456789]" <-- [] bruges til at angive en gruppe
regEx.Pattern = "[0-9]" <-- kan også angives som en rækkefølge
regEx.Pattern = "\d" <-- tag der angiver alle tal

Find tlfnr (8 tal i rækkefølge):
regEx.Pattern = "\d{8}" <-- {} angivet et antal gange forige tag skal forkomme. Ensbetydne med 8 tal i rækefølge

Find alle <span>:
regEx.Pattern = "<span>" <-- Ikke noget specielt ved den.

Find alle <span> og </span>:
regEx.Pattern = "</?span>" <-- ? er her et wildcard på / tegnet som står foran. Betyder at / skal forkommen 0 eller 1 gang
Avatar billede fennec Nybegynder
20. november 2006 - 13:03 #8
Også er der desuden også en gemVariabel funktion.

Hver () der er i pattern bliver gemt i en $x variabel som kan bruges i replace. Der kan kun gemmes 9 variabler. Altså op til 9 ().

Sæt target="_blank" på alle links:
regEx.Pattern = "<a (.*?)>" <-- Gem alt data i () i først variabel $1
tekst = regEx.Replace(tekst, "<a $1 target=""_blank"">")
Avatar billede wittrup Nybegynder
20. november 2006 - 13:25 #9
fennec: Skriv lige et svar.. så får du points :D
Avatar billede fennec Nybegynder
20. november 2006 - 13:31 #10
.o) <-- One Eyed Jack
Avatar billede wittrup Nybegynder
20. november 2006 - 19:40 #11
Fennec .. lige et tillægs spg. Er det muligt at fjerne alle HTML tage undtagen img tags med regEx ? If so.. how ? .. Hvis det ikke er for svært / meget arbejde..
Avatar billede fennec Nybegynder
21. november 2006 - 08:57 #12
Det kan helt sikkert lade sig gøre. Desværre kan jeg ikke se hvordan, da jeg aldig har haft brug for en NOT løsning, så den må du have over i RegExp kategorien. De kan sikkert hjælpe dig på 2 sek.

Husk at sige at det er til ASP, da du ellers risikere at få en syntax til java, php eller andet sprog. RegExp eksistere nemlig i mange forskellige sprog, og der er små syntaxforskelle.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester