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