bergetun Skrevet 9. mai 2004 Skrevet 9. mai 2004 La oss si jeg har denne koden her.. char* htmlLinje = "Dette er en linje <a href=\"index.html\">link1</a> Windows er ett \"stabilt\" OS <a href=\"meny.htm\"> Link2</a> mer piss om at windows suger"; Det jeg skal gjøre er å hente ut kun linkene fra htmlLinje, altså index.html og meny.htm i dette tilfellet.
A_N_K Skrevet 9. mai 2004 Skrevet 9. mai 2004 /me foreslår å slå opp på regular expressions, for C blir vel dette POSIX regex (regex.h).
bergetun Skrevet 9. mai 2004 Forfatter Skrevet 9. mai 2004 /me foreslår å slå opp på regular expressions, for C blir vel dette POSIX regex (regex.h). Hmm. regexp har aldri vært min sterke side
A_N_K Skrevet 9. mai 2004 Skrevet 9. mai 2004 (endret) Du kan like gjerne lære det først som sist: "<a href=\"([^\"]+)\">" Denne regexpen funker i Python i alle fall. Edit: Forklaring på regexp -> Uttrykk omsluttet av paranteser ([^\"]+) blir gruppert, tanken er at du kan hente ut disse gruppene fra en match. Uttrykket vi ser etter [^\"]+ vil si at vi er ute etter flere ('+') forekomster av andre tegn enn " [^\"] , dvs. en link avsluttet av tegnet ". Resultatet er at vi fanger opp tekst omsluttet av '<a href="' og '">'. Vet ikke helt hvordan dette gjøres med POSIX regex (vant til Python/Perl og Boost regex), men i Python kan man hente ut alle matchende forekomster i en streng. Endret 9. mai 2004 av A_N_K
søppel Skrevet 9. mai 2004 Skrevet 9. mai 2004 (endret) Du kan jo jalle rundt med disse, slå opp med man: strstr .. strspn .. strsub .. index .. strsep .. strtok Det er kanskje like greit å lære regexp. ..eller kanskje flex eller yacc eller-noe-sånnt-noe. Endret 9. mai 2004 av søppel
A_N_K Skrevet 9. mai 2004 Skrevet 9. mai 2004 Like greit å lære seg regexp med det samme, du kommer til å takke deg selv senere :_p
d0ppler Skrevet 10. mai 2004 Skrevet 10. mai 2004 Like greit å lære seg regexp med det samme, du kommer til å takke deg selv senere :_p jepp, regular expressions er uunværlig først du lærer det!
bergetun Skrevet 10. mai 2004 Forfatter Skrevet 10. mai 2004 Jeg har prøvd å finne noen bra sider som tar for seg regexp i C men jeg har ikke funnet noen. ER det noen her som vet om noen bra sider for dette ? Takker ..
d0ppler Skrevet 10. mai 2004 Skrevet 10. mai 2004 googlet, og fant denne. jeg lærte meg regex med Mastering Regular Expressions, 2nd Edition
A_N_K Skrevet 10. mai 2004 Skrevet 10. mai 2004 (endret) Ok, tenkte jeg kunne benytte anledningen til å gjøre meg kjent med POSIX regex også (håper egentlig jeg slipper å bruke det i praksis): #include <regex.h> #include <stdio.h> #include <malloc.h> #include <string.h> int main() { char *htm = "Dette er en linje <a href=\"index.html\">link1</a> Windows er ett \"stabilt\" OS <a href=\"meny.htm\"> Link2</a>" "mer piss om at windows suger"; // Kompiler regulært uttrykk regex_t reLink; if (regcomp(&reLink, "<a href=\"([^\"]+)\">[^<]+</a>", REG_EXTENDED)) { fprintf(stderr, "No workee\n"); return 1; } // Utfør den første matchen regmatch_t m[2]; // Ett match-objekt for hele matchen, og ett for submatch (selve linken) int res = regexec(&reLink, htm, 2, m, REG_NOTBOL); // 0 betyr suksess char *scratch = NULL; // Buffer while (!res && m[0].rm_so != -1 && m[1].rm_so != -1) { // rm_so betyr start av match, rm_eo slutt av match size_t sz = m[1].rm_eo - m[1].rm_so + 1; // Størrelse på link + terminerende null scratch = realloc(scratch, sz); // Øk buffer om nødvendig strncpy(scratch, htm + m[1].rm_so, sz - 1); // Kopier over link scratch[sz - 1] = 0; // Terminer printf("Got me one ma: %s\n", scratch); htm += m[0].rm_eo; // Fortsett forbi match res = regexec(&reLink, htm, 2, m, 0); } free(scratch); regfree(&reLink); // Frigjør ressurser return 0; } Ser ut til å funke for meg, men ikke skyt meg om det er noen subtile bugs :] Fant forresten en bra side (tror jeg): http://www.mit.edu:8001/afs/athena.mit.edu...ml/regex_7.html Endret 10. mai 2004 av A_N_K
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå