Avatar billede skildpadden Nybegynder
27. september 2010 - 20:07 Der er 11 kommentarer og
1 løsning

Replace virker ikke - RegExp måske?

Jeg har nedenstående html.

Id ændres hele tiden til en ny værdi, så id er aldrig det samme.

Jeg mangler et script som kan udskrive det som står efter det første </a> samt et andet script som udskriver det som står efter det andet </a>

Jeg kan ikke bruge replace, da id jo aldrig er det samme.

Jeg har tænkt i noget med RegExp, men har absolut ingen erfaring med at bruge dette.

Er der nogen som kan hjælpe mig?




<table>
    <tr>
        <td><a id="abc12345">abc12345</a><a id="bbb23456">bbb23456</a><a id="ccc34567">ccc34567</a></td>
    </tr>
</table>
Avatar billede erikjacobsen Ekspert
27. september 2010 - 20:19 #1
Hvad er det du skal have udskrevet i dit eksempel?
Avatar billede skildpadden Nybegynder
27. september 2010 - 20:22 #2
I eksemplet vil det være:

<a id="bbb23456">bbb23456</a><a id="ccc34567">ccc34567</a></td>
    </tr>
</table>


og derefter:

<a id="ccc34567">ccc34567</a></td>
    </tr>
</table>
Avatar billede erikjacobsen Ekspert
27. september 2010 - 20:45 #3
Jeg formoder det er gammeldags ASP, med VBScript. Ikke just "state-of-the-art", men det kan da bringes til at virke, hvis jeg forstår dig rigtigt.

http://asp.n0p.com/919872.asp kører dette lille script:

<%

a = "<table>" & vbcrlf &  _
    "<tr>" & vbcrlf & _
    "<td><a id=""abc12345"">abc12345</a><a id=""bbb23456"">bbb23456</a><a id=""ccc34567"">ccc34567</a></td>" & vbcrlf & _
    "</tr>" & vbcrlf & _
    "</table>"
   
response.write server.htmlencode(a)

response.write "<hr><br>"

Set myRegExp = New RegExp
myRegExp.IgnoreCase = True
myRegExp.Global = True
myRegExp.Pattern =  "</a>((.|\n)*)"

Set myMatches = myRegExp.Execute(a)
For Each myMatch in myMatches
  response.write "MATCH: "
  response.write server.htmlencode(myMatch.submatches(0)) & "<br>"
Next

myRegExp.Pattern =  "</a>((.|\n)*?)</a>((.|\n)*)"

Set myMatches = myRegExp.Execute(a)
For Each myMatch in myMatches
  response.write "MATCH: "
  response.write server.htmlencode(myMatch.submatches(2)) & "<br>"
Next

%>
Avatar billede skildpadden Nybegynder
27. september 2010 - 22:38 #4
Tusind, tusind tak!

Kan jeg få dig til hurtigt at forklare mig hvad de enkelte linjer i koden gør? Det vil være en stor hjælp til at jeg selv kan forstå hvordan RegExp fungerer.

Tak igen...
Avatar billede erikjacobsen Ekspert
27. september 2010 - 23:15 #5
Nej, det har jeg ikke kræfter til.
Avatar billede skildpadden Nybegynder
28. september 2010 - 07:19 #6
Fair nok.. tak for hjælpen
Avatar billede skildpadden Nybegynder
28. september 2010 - 07:19 #7
svar
Avatar billede erikjacobsen Ekspert
28. september 2010 - 08:16 #8
Men hvis du kan spørge til noget specifikt, vil jeg gerne prøve at hjælpe dig med at forstå. Jeg kan bare ikke begynde at skrive en ny lærebog i regulære udtryk ;)
Avatar billede skildpadden Nybegynder
28. september 2010 - 08:37 #9
Det lyder super! Værdsætter det meget.

Det som forvirrer, er nok:

myRegExp.Pattern =  "</a>((.|\n)*)"

Hvad betyder tegnende som står efter "</a>"?


samt

myRegExp.Global = True

Hvad gør denne linje?
Avatar billede erikjacobsen Ekspert
28. september 2010 - 09:13 #10
Når "global" er true finder den mere end den første forekomst. Det er vist lige meget her.

I regulære udtryk er der almindelige tegn, og "magiske" tegn.

De almindelige tegn betyder hvad de er:

  </a>

De magiske tegn:

  ((.|\n)*)

skal forklares.

  .|\n

betyder "et vilkårligt tegn ELLER linieskift"

  (noget)*

betyder at "noget" kan forekomme 0 eller flere gange. Og parenteser fungerer som parenteser plejer, plus at man kan aflæse i submatches hvad en given parentes indeholder.

Så det der står i </a>((.|\n)*) er blot at vi leder efter det første </a> og tager alt hvad der står bagefter, og kan finde det sidste i submatch nummer 0
Avatar billede skildpadden Nybegynder
28. september 2010 - 17:12 #11
Du har virkelig været en kæmpe hjælp for mig - tak tak tak.

Måske du kan hjælpe mig med en sidste ting...

Hvis nu at jeg ønsker at gøre det omvendt, således at jeg får udskrevet alt hvad der er INDEN første </a> samt INDEN det andet </a>

Således at jeg får henholdsvis:

<table>
    <tr>
        <td><a id="abc12345">abc12345


og


<table>
    <tr>
        <td><a id="abc12345">abc12345</a><a id="bbb23456">bbb23456
Avatar billede erikjacobsen Ekspert
28. september 2010 - 23:25 #12
Kører på http://asp.n0p.com/919872a.asp og indeholder nedenstående. En bemærkning er at regulære udtryk med et * eller + pr default er grådige, og forsøger at matche så meget som muligt. Men man får dem til at stoppe på første match ved at sætte et ? efter * eller +.

<%

a = "<table>" & vbcrlf &  _
    "<tr>" & vbcrlf & _
    "<td><a id=""abc12345"">abc12345</a><a id=""bbb23456"">bbb23456</a><a id=""ccc34567"">ccc34567</a></td>" & vbcrlf & _
    "</tr>" & vbcrlf & _
    "</table>"
   
response.write server.htmlencode(a)

response.write "<hr><br>"

Set myRegExp = New RegExp
myRegExp.IgnoreCase = True
myRegExp.Global = True
myRegExp.Pattern =  "^((.|\n)*?)</a>"

Set myMatches = myRegExp.Execute(a)
For Each myMatch in myMatches
  response.write "MATCH: "
  response.write server.htmlencode(myMatch.submatches(0)) & "<br>"
Next

myRegExp.Pattern =  "((.|\n)*?</a>(.|\n)*?)</a>"

Set myMatches = myRegExp.Execute(a)
For Each myMatch in myMatches
  response.write "MATCH: "
  response.write server.htmlencode(myMatch.submatches(0)) & "<br>"
Next

%>
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