| 12
 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