04. september 2002 - 12:18Der er
11 kommentarer og 3 løsninger
Problemer med replace funktionen
Hejsa jeg har lavet et script der løber et HTML dokument igennem og leder efter <FONT SIZE=5> og </FONT> og erstatter det med <H2> og </H2>. Problemet er så at den f.eks. skal jo ikke fjerne </FONT> der tilhøre <FONT SIZE=4>
Derfor kan kan jo sige til replace funktionen at den kun skal tage en tag og starte med at søge et vist sted. Fin fin, jeg har puttet den i en loop hvor jeg søger efter possisjonen til <FONT SIZE=5> med Instr() funktionen og stopper loopet når den ikke kan finde flere.
Den possisjon den finder lægger den i replace funktionen der hvor den skal starte derved finder den den første </FONT> efter <FONT SIZE=5> og replacer den!
Problemet her er så at når jeg putter er variabel ind istedet for et tal i replace start tingen så spiser den min html streng. Meget mærkeligt. Er det en fejl i ASP eller hvad???
Replace funktionen ser sådan her ud:
Replace(expression, find, replacewith[, start[, count[, compare]]]) (Det er start der er problemet)
Instr funktionen ser sådan her ud: InStr([start, ]string1, string2[, compare])
Min funktionen ser sådan her ud: --------------------------------------------------------- posisjon = 1
' Lav et regExp objekt Set regEx = New RegExp ' Dette er pattern, der skal søges efter regEx.Pattern = "<FONT SIZE=5>(.*?)</FONT>" ' Vi vil finde mere end bare den første forekomst, så global skal være true regEx.global = true ' Foretag selve erstatningen resultat = regEx.Replace( kildeStreng, "<h2>$1</h2>" )
Hmm "eagleeye" har du læst problemstillingen?? I din løsnng søger den stadig fra punkt 1. (strRpl = Replace(strRpl,"</font>","</h2>",[1],1,0)) Det vil sige at den stadig kommer til at fjerne </FONT> taget fra de andre <FONT SIZE=et andet tal end 5>
Hmm jeg har ikke brugt regExp før.
Kunne du ikke lave et mere konkret eksempel jeg kunne bruge lidt nemmere?? Hvor får du foresten de mærkelige tegn fra??? Hvordan ved du at det virker?? (Det ligner lidt på noget PHP)
Ps. Jeg har lavet et script nu som kan lave det samme, men det er lavet på en lidt tåbeligt måde. (Instr() og Mid()). Jeg vil dog gerne løse det på "rigtig måde" så jeg vil stadig give point hvis i kan løse det! Har bare ikke så meget tid til at prøve halve løsninger lige nu. Jeg har en deadline, men jeg skal nok tjecke det efter!
Du kan godt bruge regExp: Men det er så en god ide også at sætte den til IgnoreCase så den fanger både store og små bogstaver:
str = "En test <font size=3>TEST</font> mere test <font size=5>gerne h2 tags omkring</font> kajdf"
' Lav et regExp objekt Set regEx = New RegExp ' Dette er pattern, der skal søges efter regEx.Pattern = "<FONT SIZE=5>([^<]*?)</FONT>" ' Vi vil finde mere end bare den første forekomst, så global skal være true regEx.global = true regEx.IgnoreCase = true ' Foretag selve erstatningen resultat = regEx.Replace(str , "<h2>$1</h2>" ) Set regEx = Nothing
mappe=Server.MapPath(".") Set objFS=server.CreateObject("scripting.FileSystemObject") Set objFG=server.CreateObject("scripting.FileSystemObject")
If objFS.FileExists(mappe & "\" & fil)=true Then Set objTextS=objFS.OpenTextFile(mappe & "\" & fil,ForReading, TristateFalse)
If objFS.FileExists(mappe & "\" & fil)=true Then Set objGem=objFS.OpenTextFile(mappe & "\" & gemfil,ForWriting, TristateFalse) Else Set objGem=objFS.CreateTextFile(mappe & "\" & gemfil,False,False) End if
Do While objTextS.AtEndOfStream<>True tempstr=objTextS.Readline If startok=0 Then While Instr(UCASE(tempstr),UCASE(starttxt)) tempstr=Replace(UCASE(tempstr),UCASE(starttxt),UCASE(replstart),1,1,1) startok=1 slutok=0 IF Instr(UCASE(tempstr),UCASE(sluttxt))<>0 Then tempstr=Replace(UCASE(tempstr),UCASE(sluttxt),UCASE(replslut),1,1,1) slutok=1 startok=0 End if Wend Else While Instr(UCASE(tempstr),UCASE(sluttxt))<>0 tempstr=Replace(UCASE(tempstr),UCASE(sluttxt),UCASE(replslut)) slutok=1 startok=0 IF Instr(UCASE(tempstr),UCASE(starttxt))<>0 Then tempstr=Replace(UCASE(tempstr),UCASE(starttxt),UCASE(replstart)) slutok=0 startok=1 End if Wend End if objGem.Writeline tempstr Response.Write tempstr Loop
objGem.Close objTextS.CLose Set objGem=Nothing Set objTextS=Nothing Set objFG=Nothing Set objFS=Nothing Else Response.write("Fejl Filen er ikke fundet ") Set objFG=Nothing Set objFS=Nothing End If %>
Denne søger og erstatter med STOR tekst, så det er vel vigtigt at det kun er tags der søges efter !
Hmm ja langes eksempel virkede jo fint fint. Lækker lille kode. Så han få da meste af pointne. Eagleeye kom lige med linebrackeren, så han får lidt. Bensons eksempel har jeg ikke prøved. Det er lige så indviklet som det jeg selv har lavet, men du får også nogle point, for det virker sikkert!
Jo, Regular Expression (RegExp) er især kendt fra Unix/Linux verdenen og dermed også PHP. Det er et fremragende og meget kraftfuldt værktøj, når man skal lave streng-sammenligninger, der bare er en smule avancerede.
Pattern = "<FONT SIZE=5>(.*?)</FONT>" betyder: Find alle forekomster af en streng, der begynder med "<FONT SIZE=5>" efterfulgt af 0 eller flere vilkårlige tegn indtil "</FONT>". Spørgsmålstegnet er med for at sikre, at rækken af vilkårlige tegn bliver kortest muligt - uden det ville den matche så meget som muligt og altså muligvis springe flere <FONT>-tags over.
Pattern = "<FONT SIZE=5>([^<]*?)</FONT>" betyder: Find alle forekomster af en streng, der begynder med "<FONT SIZE=5>" efterfulgt af 0 eller flere characters, der må være alt andet end "<", indtil "</FONT>".
Jeg prøvede denne kode med variabler og der virkede den ikke hvorfor det??
' Lav et regExp objekt Set regEx = New RegExp ' Dette er pattern, der skal søges efter regEx.Pattern = var1 & "([^<]*?)" & var2 ' Vi vil finde mere end bare den første forekomst, så global skal være true regEx.global = true regEx.IgnoreCase = true ' Foretag selve erstatningen resultat = regEx.Replace(str , var3 & "$1" & var4 ) Set regEx = Nothing
Tja, det kommer jo voldsomt meget an på, hvad der er i din str og i de 4 "var"-variable, og hvordan det ikke virkede. Forsvandt alt din tekst, blev intet erstattet eller noget tredje?
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.