Gå til innhold

Trenger litt string hjelp i C Programmering


Anbefalte innlegg

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.

Lenke til kommentar
Videoannonse
Annonse

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 av A_N_K
Lenke til kommentar

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 av søppel
Lenke til kommentar

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 av A_N_K
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...