20. juni 2004 - 21:28Der er
42 kommentarer og 1 løsning
Parse data ved hjælp af RegExp
Jeg har en html side med ca. 200 rækker i en tabel... Jeg skal bruge det data der i tabellen og så tænkte jeg på at parse det med RegExp og så bare tage dataen derfra? Er det muligt og i så fald hvordan ville man lave en streng der kan gøre følgende...
Her er det vigtigste, du skal selvfølgelig splitte din tabel, f.eks. med '</tr>' og så skal du bagefter køre replacen på alle delstrenge, og til sidst splitte dine data for den delestreng, du vælger i replace-linjen (her har jeg brugt et komme, men du skal vælge en, du ved ikke forekommer i dine data !-)
hmm... hvordan vil det se ud hvis man gjore det i ASP istedet? Altså RegExp delen burde være det samme... men tænkte på hvordan man lige får den til at gøre det de 200 gange...
Brug split-funktionen til at dele dine data op i et array, løb arrayet igennem, udfør en replace overfor de enkelte værdier, og lav så en split på værdierne tilsidst, og du burde kunne lave et to-dimensionelt array ...
Har lige et sidste spørgsmål kan det passe at RegExp er MEGET langsom... Det er fordi jeg har skrevet 2 parserer... den ene med RegExp den anden er hardcoded hvor den fjerner alt html indtil der kun er dataen tilbage... kan det passe at den er 4-5 gange langsommere?
Normalt er regexp hurtigere, specielt hvis opgaverne bliver lidt komplicerede, men du opretter jo regexp'en på ny ved hvert gennemløb, jeg vil tro, at det flytter ret voldsomt på afviklingstiden, hvis du bare opretter den en gang og så hiver data ud med den samme regexp-instans hver gang !-)
-- og jeg overvejede også simpelthen at fjerne alle tags, for umiddelbart ville det jo være lettere, men det satte linket jo en stopper for ...
hmm... så må der være noget galt med Pattern igen ... nu har jeg prøvet flere ting... men hvis jeg laver en string med fx. 2 af dem i så finder den kun den ene.. hvorfor? men hvis jeg gør det mega simpelt som fx. sætter den til at finde "is" i denne streng "IS1 is2 IS3 is4" virker det fint...
For da jeg prøvede måtte jeg fjerne linjeskift i strengen, fordi jeg hentede det som innerHTML, og der var den IE-maskine, der sidder i min webwriter, så venlig at indsætte et utal af linjeskift ...
-- og selv om .* burde betyde et hvilkensomhelst antal af et hvilkensomhelst tegn, måtte jeg altså først fjerne linjeskiftene med replace(/(\r\n|\n|\r)/g,"") -- igen javascript !-)
det er stadig det samme... har fjernet dem med en replace på Chr(9) - 10 - 11 - 12 - 13 ... hvilket svare til det samme som du skriver i JS... men det virker stadig ikke...
men har fundet ud af at den tror at HELE strengen som er ca 27800 char lang er et match.... men det burde den da ikke kunne med det pattern du har sat?
ja men det kan jeg sagtens... det var den måde jeg gjore det på før... men så vil den jo kun finde en pr element i arrayen dvs.. en pr. </tr> ville gerne lave denne funktion her...
RegExp.Pattern = "<td[^>]*>([^<]*).*<td[^>]*>([^<]*).*<td[^>]*>([^<]*).*<td[^>]*>([^<]*).*<td[^>]*>.*<td[^>]*><a href=""([^""]*)"">([^<]*)" Set Matches = RegExp.Execute(RetStr) ' Execute search. For Each Match in Matches ' Iterate Matches collection. 'Gør noget her!!! Next
men så er det jeg kun får et match... :(
før der lavede jeg bare et array inden i funktionen og satten den til at scanne hvert ellement i arrayet for mit pattern..
<script language="javascript" type="text/javascript"> function test(){ var tim = new Date(); var x = document.getElementById('datadiv').firstChild.firstChild.innerHTML; var nytim = new Date(); var reg = /\s+<td[^>]*>([^<]*).*\s+<td[^>]*>([^<]*).*\s+<td[^>]*>([^<]*).*\s+<td[^>]*>([^<]*).*\s+<td[^>]*>.*\s+<td[^>]*><a href="([^"]*)">([^<]*).*<\/tr>/gi; x = x.match(reg) var data = new Array(x.length); for(i=0;x.length>i;i++){ data[i] = x[i].replace(reg,"$1,$2,$3,$4,$5,$6").split(","); } var nytim = new Date(); alert(data.length+"\n"+data+"\n"+(nytim.getTime()-tim.getTime())/1000); } </script> <body onload="test()">
-- og, ja, så er det zq hurtigt, en lille stribe tests af ovenstående javascript gav ca. 2 ud af 3 gange 0.062 eller 0.063 s., resten af gangene gav det 0.046 eller 0.047 s. altså 0.04 til 0.05 millisekunder pr. variabel !-)
Nej, der kommer jeg til kort med vbscripts måde at behandle detaljer i array; som du vil kunne se, har jeg replacet og splittet det bagefter ...
nej ikke helt... for det den gør at den returnerer hele strengen altså alt HTML med også.... dvs det er en grov sortering... det jeg skal bruge er nu en måde at extracte () ud af den.... ligesom man i en Replace får dem ud med $1 osv... det er det jeg leder efter... :/
yep.. :) ... og nu er det klar til at blive smidt ind i et 2 dimensionelt array og videre derfra til en sql DB.. og så er aftenens strabadser forbi...
Synes godt om
Slettet bruger
26. juni 2004 - 13:09#42
roenving: Normalt er * grådig. Dvs. den vælger det længste mulige match. Ved at sætte et ? bagefter gøres den ikke-grådig. Hvis alle * i en RegEx skal være ikke-grådige, kan man normalt sætte en option til det. I Perl eller PHPs preg-funktioner gøres det med et U som i /pattern/U
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.