Avatar billede vis399cll Nybegynder
04. september 2002 - 12:18 Der 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

MyPos = Instr(posisjon, theString, "<FONT SIZE=5>" , 1)

' Kør scripet indtil den ikke kan finde flerer tags at sifte ud
DO WHILE MyPos <> 0

IF Not Response.IsClientConnected then
  Response.End
End If

strTemp = replace(theString, "<FONT SIZE=5>" , <H2>, MyPos, 1, 1)
strTemp = replace(strTemp, "</FONT> ",  "</H2>", MyPos, 1, 1)

IF strTemp = "" Then
  bDummy = True
Else
  theString = strTemp
End If

'Lægger posisjonen
posisjon = MyPos

'Finder posisjonen til det første tag
MyPos = Instr(posisjon, theString, "<FONT SIZE=5>", 1)

IF bDummy = True THEN
  MyPos = 0
END IF

LOOP

--------------------------------------------

What to do, what to do?
Avatar billede eagleeye Praktikant
04. september 2002 - 12:31 #1
Prøv med denne:


    str = ".....Din streng som skal lave om...."

    strRpl = str
    DO
      startPos = Instr(1,strRpl, "<FONT SIZE=5>", 1)
      slutPos = InStr (Cint(startPos)+1,strRpl,"</FONT>",1) 
      If (startPos > 0) and (slutPos > 0) then
        strRpl = Replace(strRpl,"<FONT SIZE=5>","<h2>",1,1,0)
        strRpl = Replace(strRpl,"</font>","</h2>",1,1,0)
      end if
    LOOP WHILE (startPos > 0) and (slutPos > 0)   
    str = strRpl


Response.write str
Avatar billede lange Nybegynder
04. september 2002 - 12:34 #2
Eller vha regular expressions:

' 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>" )
Avatar billede benson Nybegynder
04. september 2002 - 12:52 #3
Jeg spørger lige :

Hvad hvis </FONT> først finde på næste linie ?
Avatar billede lange Nybegynder
04. september 2002 - 13:39 #4
regEx.Pattern = "<FONT SIZE=5>([^<]*?)</FONT>"

burde fungere på tværs af linebreaks.
Avatar billede vis399cll Nybegynder
04. september 2002 - 16:35 #5
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!
Avatar billede eagleeye Praktikant
06. september 2002 - 23:39 #6
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

Response.Write resultat
Avatar billede benson Nybegynder
07. september 2002 - 01:20 #7
<% @Language=VBScript %>
<%
REsponse.expires=0

    const ForReading=1, ForWriting=2, ForAppending=8
    const TristateUseDefault=-2
    const TristateTrue=-1
    const TristateFalse=0

    fil="demo.html"
    gemfil="red_demo.html"


    starttxt="<FONT SIZE=5>"
    Sluttxt="</FONT>"
   
    replstart="<H2>"
    replslut="</H2>"

    startok=0
    slutok=0
    linjetjekket=0
    beggetjek=0

    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 !

Benson
Avatar billede benson Nybegynder
07. september 2002 - 16:35 #8
UPS !

Det er jo hele linjen der bliver til stor tekst !

Nå men, så fjerne vi bare alle UCASE, og håber på at vi bruger samme tegnsætning til alle tags ! :-)
Avatar billede vis399cll Nybegynder
11. september 2002 - 11:25 #9
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!

Hygge og tak for hjælpen!
Avatar billede lange Nybegynder
11. september 2002 - 11:42 #10
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.

RegEx er forholdsvist let at anvende, når først man får grejet den temmeligt kryptiske syntax, der anvendes til patterns ("de mærkelige tegn"). Du kan finde en reference på http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/vspropattern.asp.http://py-howto.sourceforge.net/regex/regex.html er en udmærket Regular Expression HowTo, der dog er Python-centreret, men afsnittene om opbygning af patterns er stadigvæk gældende.

For at være lidt mere konkret:


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>".

Held og lykke med at kigge nærmere på det :)
Avatar billede vis399cll Nybegynder
11. september 2002 - 11:48 #11
Takker mange gange igen. Jeg har også været ude og finde nogle artikler om det!

http://www.aspalliance.com/brettb/VBScriptRegularExpressions.asp
Avatar billede vis399cll Nybegynder
17. september 2002 - 11:32 #12
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

Response.Write resultat
Avatar billede lange Nybegynder
17. september 2002 - 12:24 #13
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?
Avatar billede vis399cll Nybegynder
17. september 2002 - 12:52 #14
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