1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
int main (void)
{
int err;
regex_t preg;
char *entree = "http://<a href="http://www.developpez.net/forums/index.php" target="_blank">www.developpez.net/forums/index.php</a> http://www.monsiteamoi.com/index.php";
// On copie entree dans str_request aprés un malloc pour pouvoir faire du realloc ensuite
char *str_request ;
str_request = malloc(strlen(entree));
strncpy(str_request,entree,strlen(entree));
const char *str_regex = "(www\\.[-_[:alnum:]]+)(\\.[[:lower:]]{2,4})";
// On compile l'expression
err = regcomp (&preg, str_regex, REG_EXTENDED);
if (err == 0) {
/* On ne fait le test de réussite de la compilation qu'une fois,
Si ca marche une fois, ca marche tout le temps !! */
int match;
size_t nmatch = 0;
regmatch_t *pmatch = NULL;
nmatch = preg.re_nsub;
pmatch = malloc (sizeof (*pmatch) * nmatch);
if (pmatch){
char *site = NULL ; // Utiliser pour stocker le résultat de la recherche
char *tmp = NULL; // Utiliser pour stocker temporairement la nouvelle valeure de str_request pendant sa modification
while (1){
nmatch = preg.re_nsub;
//pmatch = malloc (sizeof (*pmatch) * nmatch);
pmatch = realloc (pmatch, sizeof (*pmatch) * nmatch);
err = regcomp (&preg, str_regex, REG_EXTENDED);
nmatch = 0;
pmatch = NULL;
nmatch = preg.re_nsub;
pmatch = (regmatch_t *) realloc (pmatch, sizeof (*pmatch) * nmatch);
match = regexec (&preg, str_request, nmatch, pmatch, 0);
/* Il faut toujours faire un regfree et recompiler l'expression avant le regexec
Dès que le regexec a été effectué, on peut faire le regfree*/
regfree (&preg);
if (match == 0){ // Si match==0, c'est que nous avons un résultat
/* pmatch[0].rm_so contient l'offset du début de la correspondance soit le premier w
pmatch[0].rm_eo contient l'offset de la fin de la correspondance soit le t de .net pour la premiére boucle */
int start = pmatch[0].rm_so;
int end = pmatch[0].rm_eo;
size_t size = end - start ;
site = (char *)realloc(site, sizeof(*site) * size );
if (site){
strncpy (site, &str_request[start], size);
printf ("%s\n", site);
}
/* On va réduire la variable str_request en prenant comme point de départ la fin de correspondance de l'expression réguliere. Notez bien que le http:// du début saute meme si il ne fait pas parti du résultat.
Après la premiere passe il reste donc /forums/index.php http://www.monsiteamoi.com/index.php
*/
tmp=(char *)realloc(tmp,strlen(str_request)-size);
strncpy(tmp,&str_request[end],strlen(str_request)-size);
str_request=realloc(str_request,strlen(str_request)-size);
str_request=tmp;
site=NULL;
} else if (match == REG_NOMATCH) { // L'expression réguliere ne retourne rien
printf ("%s n\'est pas une adresse internet valide\n", str_request);
break;
} else {
/* ce bloc else, je le laisse car gege2061 l'a mis mais je pense qu'on ira jamais car regexec ne retourne que 0 ou REG_NOMATCH. Ce bloc trouve plus sa place en d'erreur sur regcomp (comme en dessous)
*/
char *text;
size_t size;
size = regerror (err, &preg, NULL, 0);
text = malloc (sizeof (*text) * size);
if (text) {
regerror (err, &preg, text, size);
fprintf (stderr, "%s\n", text);
free (text);
} else {
fprintf (stderr, "Memoire insuffisante\n");
exit (EXIT_FAILURE);
}
break;
}
}
} else {
// Erreur d'allocation mémoire (ca peut vraiment arrivé ?? ( question pour gege2061)
fprintf (stderr, "Memoire insuffisante\n");
exit (EXIT_FAILURE);
}
} else {
// Erreur de compilation de l'expression réguliére
char *text;
size_t size;
size = regerror (err, &preg, NULL, 0);
text = malloc (sizeof (*text) * size);
if (text) {
regerror (err, &preg, text, size);
fprintf (stderr, "%s\n", text);
free (text);
} else {
fprintf (stderr, "Memoire insuffisante\n");
exit (EXIT_FAILURE);
}
}
puts ("\nPress any key\n");
/* Dev-cpp */
getchar ();
return (EXIT_SUCCESS);
} |
Partager