Avatar billede mini-me Nybegynder
12. oktober 2008 - 08:54 Der er 10 kommentarer og
1 løsning

Søg og erstat med RegExp

Hej,

Jeg har brug for hjælp til at få min funktion til at virke.

Via en editor sender jeg følgende data til min variabel inpContent.

"-----------------------------"
<p>Kontaktformular</p>
<p>
  <img alt="!moduleStart!contactform(79)!moduleEnd!" src="/admin/editor/scripts/module.gif" />
</p>
<p>Billede galleri</p>
<p>
  <img alt="!moduleStart!gallery(25)!moduleEnd!" src="/admin/editor/scripts/module.gif" />
</p>
<p> Nyhedsbrev</p>
<p>
  <img alt="!moduleStart!newsletter(37)!moduleEnd!" src="/admin/editor/scripts/module.gif" />
</p>
"----------------------------------"

"----------------------------------"
Her starter min funktion
<%

      webSiteContent = Request.Form("inpContent")
        'this sub finds the matches
        Sub RegExpTest(strMatchPattern, strPhrase)
            'create variables
            Dim objRegEx, Match, Matches, StrReturnStr
            'create instance of RegExp object
            Set objRegEx = New RegExp
            'find all matches
            objRegEx.Global = True
            'set case insensitive
            objRegEx.IgnoreCase = True
            'set the pattern
            objRegEx.Pattern = strMatchPattern
            'create the collection of matches
            Set Matches = objRegEx.Execute(strPhrase)
            'print out all matches
            For Each Match in Matches
                strReturnStr = "Match found at position "
                strReturnStr = strReturnStr & Match.FirstIndex & "." & Match
                'Value is '"
                strReturnStr = strReturnStr & Match.value & "'."
                'print
                Response.Write(strReturnStr & "<BR>")
            Next
        End Sub
        'call the subroutine
        regExpTest "!moduleStart!([\s\S]+?)!moduleEnd!.", webSiteContent


Jeg får også output ud:

Match found at position 46.!moduleStart!contactform(79)!moduleEnd!"!moduleStart!contactform(79)!moduleEnd!"'.
Match found at position 179.!moduleStart!gallery(25)!moduleEnd!"!moduleStart!gallery(25)!moduleEnd!"'.
Match found at position 303.!moduleStart!newsletter(37)!moduleEnd!"!moduleStart!newsletter(37)!moduleEnd!"'.

"-----------------------------------"

Men hvordan får jeg lavet en replace funktion så jeg får et nyt output som ligner nedenstående.

Jeg ønsker blot at erstatte !moduleStart!newsletter(37)!moduleEnd!

med eks.: newsletter(37)
Avatar billede erikjacobsen Ekspert
12. oktober 2008 - 09:21 #1
Kig på metoden replace i stedet for execute.
Avatar billede erikjacobsen Ekspert
12. oktober 2008 - 09:22 #2
Avatar billede mini-me Nybegynder
12. oktober 2008 - 10:57 #3
Noget i den her stil?? Kan ikke få det til at virke...

sNewHTML = Request.Form("inpContent")
       
       
        Function ReplaceTest(patrn, replStr)
            Dim regEx, str1              ' Create variables.
            str1 = sNewHTML
            Set regEx = New RegExp            ' Create regular expression.
            regEx.Pattern = patrn            ' Set pattern.
            regEx.IgnoreCase = True            ' Make case insensitive.
            set matches = regEx.Replace(str1, replStr)  ' set matches til at finde alle emner
           
            For Each Match in Matches
                strReturnStr = "Match found at position "
                strReturnStr = strReturnStr & Match.FirstIndex & "." & Match
                'Value is '"
                strReturnStr = strReturnStr & Match.value & "'."
                Response.Write(strReturnStr & "<BR>")
            Next
        End Function

        call ReplaceTest("!moduleStart!([\s\S]+?)!moduleEnd!.", "")
Avatar billede erikjacobsen Ekspert
12. oktober 2008 - 11:20 #4
Ikke virke - hvordan?

Replace-metoden afleverer blot en streng - hvor der er lavet erstatninger.
Avatar billede mini-me Nybegynder
12. oktober 2008 - 11:52 #5
JA det virker i al fald ikke... hvis jeg gør sådan her:

   
        Function ReplaceTest(patrn, replStr)
            Dim regEx, str1              ' Create variables.
            str1 = sNewHTML
            Set regEx = New RegExp            ' Create regular expression.
            regEx.Pattern = patrn            ' Set pattern.
            regEx.IgnoreCase = True            ' Make case insensitive.
            ReplaceTest = regEx.Replace(str1, replStr)  ' set matches til at finde alle emner
           
           
        End Function

        response.Write ReplaceTest("!moduleStart!([\s\S]+?)!moduleEnd!.", "")

       
   

Så kan jeg godt få den til at replace første gang den støder på !moduleStart!newsletter(37)!moduleEnd! men de efterfølgende bliver ikke erstattet.

Men som den erstatter nu, så erstatter det hele med ingen ting.. jeg skal jo have værdien imellem modulestart og moduleend.
Avatar billede erikjacobsen Ekspert
12. oktober 2008 - 12:25 #6
Jeg går ud fra du læser lidt om det. For at erstatte med det du har parentes om i det regulære udtryk, skal du skrive (med din funktion):

    response.Write ReplaceTest("!moduleStart!([\s\S]+?)!moduleEnd!.", "$1")

Og for at gøre det for alle forekomster skal du

    regEx.Global = true
Avatar billede mini-me Nybegynder
12. oktober 2008 - 13:15 #7
Hmmm jeg forstår det ikke.. men det virker :)

sNewHTML = Request.Form("inpContent")
       
       
        Function ReplaceTest(patrn, replStr)
            Dim regEx, str1              ' Create variables.
            str1 = sNewHTML
            Set regEx = New RegExp            ' Create regular expression.
            regEx.Global = true
            regEx.Pattern = patrn            ' Set pattern.
            regEx.IgnoreCase = True            ' Make case insensitive.
            ReplaceTest = regEx.Replace(str1, replStr)  ' set matches til at finde alle emner
           
           
        End Function

        response.Write ReplaceTest("<img alt=""!moduleStart!([\s\S]+?)!moduleEnd!"" src=""/admin/editor/scripts/module.gif"" />.", "$1")


smid svar
Avatar billede erikjacobsen Ekspert
12. oktober 2008 - 14:19 #8
Jeg samler slet ikke på point, tak. Svar selv, accepter eget svar.

Men jeg kan da godt prøve at forklare, hvad du ikke forstår - ud over at det jo egentlig bare er sådan det fungerer ;)
Avatar billede mini-me Nybegynder
12. oktober 2008 - 19:05 #9
Hmmm, jeg har prøvet at kigge på andre regexp eksempler og har fået lidt mere indsigt i hvordan det virker.:

    Set regEx = New RegExp
        regEx.Global = True
        sourcestring = sNewHTML
        regEx.Pattern = "<img alt=""!moduleStart!([\s\S]+?)!moduleEnd!""[^>]*>"
        replacementstring = "<% call $1 %" & ">"
        sNewHTML = regEx.Replace(sourcestring,replacementstring)

Ovenstående løsning virker.
Avatar billede mini-me Nybegynder
12. oktober 2008 - 19:06 #10
Og lige en stor tak til erik for at hjælpe mig til at finde løsningen :-)
Avatar billede erikjacobsen Ekspert
12. oktober 2008 - 19:07 #11
Du skal blot overveje om du har brug for: regEx.IgnoreCase = True
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