"Yusron Hilmy" <[EMAIL PROTECTED]> menulis :
> Waa, hebat, aku udah coba dan, it works !!
> 
> Tapi apa flex itu cuma untuk ngambil polanya aja (kalo dari contohnya mas
> Hizazul ngambil pola tag hyperlink). Padahal kita kan juga pake regex untuk
> : substitusi, trus ngambil kemunculan ke sekian dari pola regex yang kita
> definisikan, dsb. Nah gimana caranya ??
> 
> Kalo pake library regex, hasilnya adalah pointer ke awal dan akhir tempat
> kemunculannya, jadi dari situ kita bisa mengolah sendiri lebih lanjut.
> 

Wah, pertanyaannya makin lama, makin sulit, ya. B)
Saya sendiri juga ingin tahu lebih banyak 
tentang lex dan regex. Sepertinya lex hanya
menghasilkan program scanner untuk mendeteksi
token atau mengambil pola dan bukan untuk
substitusi.
Berikut contoh program untuk retrieve link dari
a href tag dalam file html dengan menggunakan
regex.
Cara kompile :
SHELL>gcc -o href href.c

cara pakai :
SHELL>./href file1.html

Namun saya masih punya satu pertanyaan :
untuk satu problem (retrieving), mana
yang lebih cepat ,solusi program dengan regex atau
dengan lex ?

Hizazul Emkom
---------------- start of program ---------------
// href.c untuk mengambil link out dari dalam a href tag dari file html 
#include <stdio.h>
#include <regex.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>

#define _free(ptr) if (ptr) {free(ptr);ptr=NULL;}

int main(argc,argv)
int argc;
char ** argv;
{
char * p=NULL,regs[100],*http_str=NULL,*html_str=NULL;
int res,regflags=0,size_http,size_result;
regex_t regex;
regmatch_t *regmatch=NULL;
struct stat st;
int fd;

// buka file html
 
   fd = open(argv[1],O_RDONLY);

// slurping isi file ke dalam satu string

   fstat(fd,&st);
   html_str = (char *) malloc(st.st_size + 1);
   read(fd,html_str,st.st_size);
   html_str[st.st_size]=0;
   close(fd);

// ------------------------- ambil a href tag -----------------
 regmatch = (regmatch_t *) malloc (sizeof(regmatch_t)*2);
 strcpy(regs,"a href\\s*=\\s*\"([^\"]*)\""); 
 if((res = regcomp(&regex,regs,REG_ICASE | REG_EXTENDED)) != 0)
 {
        regerror(res,&regex,html_str,BUFSIZ);
        fputs(html_str,stderr);
        fputs("\n",stderr);
        return 0;
 } 
p = html_str;
for(;;)
{
 if(p && regexec(&regex, p, 2, regmatch, regflags) == 0)
 {
    // handle NULL patterns that we match
    if(regmatch[0].rm_eo - regmatch[0].rm_so == 0)
    {
       if(*p == '\0')
       {
           break;
       }
       p++;
    }
    else
    {
       // matchingnya ada disini :
       size_http = regmatch[1].rm_eo - regmatch[1].rm_so;
       http_str = (char *) malloc (sizeof(char) *(size_http+1));
       strncpy(http_str,p+regmatch[1].rm_so,size_http);
       http_str[size_http] = '\0';

       printf("%s\n",http_str);
       // majukan pointernya
       p += regmatch[0].rm_eo;
    }
  }
  else
  {
      // tidak ada matching
      break;
  }
}
 regfree(&regex);
 _free(regmatch);

 return 0;
} // end of file

---------------- end of program -----------------
-- 
_____________________________________________________________
satusports.com, situs olahraga nomor satu dan terlengkap Indonesia. 
Untuk informasi terakhir sepakbola, bolabasket, tinju, golf, dan olahraga lainnya, 
kliklah http://www.satusports.com








Powered by OutBlaze

--------------------------------------------------------------------------------
Utk berhenti langganan, kirim email ke [EMAIL PROTECTED]
Informasi arsip di http://www.linux.or.id/milis.php3
Pengelola dapat dihubungi lewat [EMAIL PROTECTED]

Kirim email ke