Avatar billede mathiash Nybegynder
22. juli 2005 - 13:11 Der er 25 kommentarer og
1 løsning

regexp og replace

Hej!

Jeg er rimelig ny til C/C++
Jeg "koder" php.

Jeg er igang med at lave mit første "brugbare" program.

En RSS Feeder.

Jeg er nået så langt så nu har jeg fået hentet xml/rss siden.
Og nu skal den bare parses.

1) Jeg har tænkt mig en funktion der finder <title>, <link> og <descreption>

i php kunne man bruge en funktion lign. preg_match_all("<title>(.*)</title>", $input, $output);

Men jeg kan forstå at der ikke er reg.exp indbygget i c/c++ som standard. Så jeg skal vel bruge en form for lib.



2) Ydermere søger jeg en replace/remove funktion til at fjerne evt. <![CDATA[


3) Og hvis der findes en nem remove_tags funktion så modtager jeg gerne også denne :P

Mvh. Mathias Hansen

PS. Jeg bruger Dev-C++ 4 som compiler
Avatar billede arne_v Ekspert
22. juli 2005 - 13:18 #1
Du kan finde f.eks. PCRE som lib og bruge det. Jeg kan godt finde
et link og et eksempel hvis det skal være.

Men C/C++ er altså lidt mere low level end PHP.
Avatar billede mathiash Nybegynder
22. juli 2005 - 13:22 #2
Okay hehe.

Jeg vil gerne have et link hvis du kan finde et :)
Avatar billede mathiash Nybegynder
22. juli 2005 - 13:22 #3
og eksempel :P
Avatar billede arne_v Ekspert
22. juli 2005 - 13:26 #4
jeg mener at det var den her jeg hapsede:
  http://prdownloads.sourceforge.net/gnuwin32/pcre-5.0.exe?download
Avatar billede arne_v Ekspert
22. juli 2005 - 13:28 #5
eksempel (dog til en lidt anden problemstilling):

#include <stdio.h>
#include <string.h>
#include <pcre.h>

void parse(char *s)
{
    int i;
    pcre *re;
    int rc;
    int erroffset;
    int ovector[300];
    const char *error;
    const char *p;
    const char label[][20] = { "func", "stringsep", "string", "stringsep", "statementsep" };
    printf("%s\n",s);
    re = pcre_compile("([a-zA-Z_][a-zA-Z_0-9]*)(?: )(\")([^\"]*)(\")(;)",0,&error,&erroffset,NULL);
    rc = pcre_exec(re,NULL,s,strlen(s),0,0,ovector,sizeof(ovector)/sizeof(int));
    pcre_get_substring(s,ovector,rc,1,&p);
    printf("func = %s\n",p);
    pcre_get_substring(s,ovector,rc,2,&p);
    printf("stringsep = %s\n",p);
    pcre_get_substring(s,ovector,rc,3,&p);
    printf("string = %s\n",p);
    pcre_get_substring(s,ovector,rc,4,&p);
    printf("stringsep = %s\n",p);
    pcre_get_substring(s,ovector,rc,5,&p);
    printf("statementsep = %s\n",p);
}

int main()
{
    parse("a \"aa\";");
    parse("b \"bb bb\";");
    return 0;
}
Avatar billede mathiash Nybegynder
22. juli 2005 - 13:29 #6
Yep det er så installeret.
Skal jeg så ikke lavet et link eller noget til pcre? fra min compiler.
Avatar billede mathiash Nybegynder
22. juli 2005 - 13:35 #7
Har lagt c filerne fra include i include på min compiler
Og så skal jeg? :P
Avatar billede mathiash Nybegynder
22. juli 2005 - 13:53 #8
Arne? :)
Avatar billede mathiash Nybegynder
22. juli 2005 - 13:59 #9
Får følgende fejl:
C:\DOCUME~1\Mini\LOKALE~1\Temp\ccOgcaaa.o(.text+0x136):sadasd.cpp: undefined reference to `pcre_compile'
C:\DOCUME~1\Mini\LOKALE~1\Temp\ccOgcaaa.o(.text+0x16f):sadasd.cpp: undefined reference to `pcre_exec'
C:\DOCUME~1\Mini\LOKALE~1\Temp\ccOgcaaa.o(.text+0x197):sadasd.cpp: undefined reference to `pcre_get_substring'
C:\DOCUME~1\Mini\LOKALE~1\Temp\ccOgcaaa.o(.text+0x1d1):sadasd.cpp: undefined reference to `pcre_get_substring'
C:\DOCUME~1\Mini\LOKALE~1\Temp\ccOgcaaa.o(.text+0x20b):sadasd.cpp: undefined reference to `pcre_get_substring'
C:\DOCUME~1\Mini\LOKALE~1\Temp\ccOgcaaa.o(.text+0x245):sadasd.cpp: undefined reference to `pcre_get_substring'
C:\DOCUME~1\Mini\LOKALE~1\Temp\ccOgcaaa.o(.text+0x27f):sadasd.cpp: undefined reference to `pcre_get_substring'

Lyder som noget der skal linkes til? Ved ik?
Avatar billede arne_v Ekspert
22. juli 2005 - 14:26 #10
ja

linker du med det lib som PCRE har installeret ?
Avatar billede mathiash Nybegynder
22. juli 2005 - 14:36 #11
Nej. Hvad hedder det? hvad skal jeg skrive? -l**?**
Avatar billede arne_v Ekspert
22. juli 2005 - 15:27 #12
"C:\Program Files\GnuWin32\lib\libpcre.dll.a"

eller

"C:\Program Files\GnuWin32\lib\libpcreposix.dll.a"
Avatar billede arne_v Ekspert
22. juli 2005 - 15:27 #13
eller

-lpcre.dll

eller

-llibpcreposix.dll

med en:

-L"C:\Program Files\GnuWin32\lib"
Avatar billede mathiash Nybegynder
22. juli 2005 - 15:45 #14
1000 tak fik det til at virke!

Kan du så ikke lige gøre en ting for mig?
Vise mig hvordan jeg kan matche ting som php's funktion.

Bare en funktion eller noget så kan jeg selv kigge på det

Og så må du meget gerne ligge et svar
Avatar billede arne_v Ekspert
22. juli 2005 - 15:53 #15
det har jeg ikke lige et eksempel på

måske kan jeg prøve at bixe noget i aften

men ellers er der docs med PCRE

og svar
Avatar billede mathiash Nybegynder
22. juli 2005 - 16:58 #16
Tak! Ja, jeg har kigget på doc'sne men syntes ikke rigtig jeg kunne finde noget.

Hvis du vil bixe noget sammen (bare lidt) så er det SUPER!

1000 tak!
Avatar billede mathiash Nybegynder
22. juli 2005 - 17:25 #17
Men kan du fortælle mig hvad dit eksempel gør? :P
Avatar billede mathiash Nybegynder
22. juli 2005 - 17:32 #18
Får hele tiden det her output: &#8593;&#9660;¶
Rimelig wierd (:
Avatar billede mathiash Nybegynder
22. juli 2005 - 17:32 #19
ja ok det kan exp ikke vise :D
Avatar billede arne_v Ekspert
22. juli 2005 - 18:36 #20
gcc -I"\Program Files\GnuWin32\include" testpcre.c "\Program Files\GnuWin32\lib\libpcre.dll.a" -o testpcre.exe

PATH=\Program Files\GnuWin32\bin;%PATH%

a "aa";
func = a
stringsep = "
string = aa
stringsep = "
statementsep = ;
b "bb bb";
func = b
stringsep = "
string = bb bb
stringsep = "
statementsep = ;

(det er en lille mini parser)
Avatar billede arne_v Ekspert
22. juli 2005 - 18:44 #21
det var nok et lidt avanceret eksempel

her er et simplere

#include <stdio.h>
#include <string.h>
#include <pcre.h>

void test(char *s)
{
    pcre *re;
    int rc;
    int erroffset;
    int ovector[300];
    const char *error;
    re = pcre_compile("[0-9]+",0,&error,&erroffset,NULL);
    rc = pcre_exec(re,NULL,s,strlen(s),0,0,ovector,sizeof(ovector)/sizeof(int));
    if(rc < 0)
    {
        printf("%s does NOT contain a number\n",s);
    }
    else
    {
        printf("%s does contain a number\n",s);
    }
}

int main()
{
    test("123");
    test("abc");
    test("123abc");
    return 0;
}

123 does contain a number
abc does NOT contain a number
123abc does contain a number
Avatar billede mathiash Nybegynder
22. juli 2005 - 19:28 #22
Hej arne!

Er det muligt at få den til at returnere det som regexp'en matcher?

fx.:
test("123"); // Returnerer 123
test("abc"); // Returnerer False / Ingen ting
test("123abc"); // Returnerer 123
Avatar billede mathiash Nybegynder
22. juli 2005 - 19:42 #23
Har kigget på pcre_get_substring_list
Men kan ikke få den til at vise
Avatar billede arne_v Ekspert
22. juli 2005 - 19:45 #24
#include <stdio.h>
#include <string.h>
#include <pcre.h>

void test(char *s)
{
    pcre *re;
    int rc;
    int erroffset;
    int ovector[300];
    const char *error;
    const char *p;
    re = pcre_compile("[0-9]+",0,&error,&erroffset,NULL);
    rc = pcre_exec(re,NULL,s,strlen(s),0,0,ovector,sizeof(ovector)/sizeof(int));
    if(rc < 0)
    {
        printf("%s does NOT contain a number\n",s);
    }
    else
    {
        pcre_get_substring(s,ovector,rc,0,&p);
        printf("%s does contain a number and it is %s\n",s,p);
    }
}

int main()
{
    test("123");
    test("abc");
    test("123abc");
    return 0;
}
Avatar billede mathiash Nybegynder
22. juli 2005 - 20:31 #25
Hej arne!

Det er simpelthen perfekt.
1000 tak fordi du gider at hjælpe mig! :)

Men hvordan finder jeg alle der matcher og ikke kun den 1.?

Man skal vist bruge
pcre_get_substring_list

Har lavet følgende:
pcre_get_substring_list(s,ovector,rc,&p);

Får denne fejl:
23 c:\docume~1\mini\dokume~1\cpp\dsfsdf.cpp
passing `const char **' as argument 4 of `pcre_get_substring_list(const char *, int *, int, const char ***)'

Kan forstå at det er noget med den type variabel?

Ved ik?
Avatar billede arne_v Ekspert
22. juli 2005 - 21:28 #26
jeg tror ikke at pcre_get_substring_list er den rigtige funktion

følgende ser ud til at virke:

#include <stdio.h>
#include <string.h>
#include <pcre.h>

void test(char *s)
{
    int ix;
    pcre *re;
    int rc;
    int erroffset;
    int ovector[300];
    const char *error;
    const char *p;
    re = pcre_compile("[0-9]+",0,&error,&erroffset,NULL);
    ix = 0;
    while((rc = pcre_exec(re,NULL,s,strlen(s),ix,0,ovector,sizeof(ovector)/sizeof(int)))>0)
    {
      pcre_get_substring(s,ovector,rc,0,&p);
      printf("%s\n",p);
      ix = ovector[1];
    }
}

int main()
{
    test("abc 123 def 456 ghi 789 xyz");
    return 0;
}
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