C++ : expression régulières et sous-chaine.

Fermé
GNUmaster Messages postés 12 Date d'inscription lundi 21 juillet 2008 Statut Membre Dernière intervention 10 avril 2012 - 7 janv. 2009 à 22:17
GNUmaster Messages postés 12 Date d'inscription lundi 21 juillet 2008 Statut Membre Dernière intervention 10 avril 2012 - 7 janv. 2009 à 22:53
Bonjour,
Je travail actuellement sur un petit robot qui a pour fonctionnalité de parcourir le web à la recherche d'informations dans le but de créer un petit moteur de recherche (pour mes études).
J'ai développé ce petit robot en c++ et j'utilise les expressions régulière (de la librairie regex.h).
Seulement j'ai un petit problème au niveau de son utilisation.

Voici la fonction que j'ai fait pour me retourner la valeur d'un champs sensé être unique dans une page html :
char* returnFromFile(char* nomFichier,char* expression)
{
	ifstream fichier(nomFichier, ios::in);  

	if(fichier) 
	{
		string ligne;
		int err;
		regex_t preg;
		char* str_request;
		const char *str_regex =expression;
		while(getline(fichier, ligne))
		{
			str_request=(char*)malloc(ligne.size()+10);// on affiche la ligne
			strcpy(str_request, ligne.c_str());
			err = regcomp (&preg, str_regex, REG_EXTENDED);
			if (err == 0)
			{
				int match;
				size_t nmatch = 0;
				regmatch_t *pmatch = NULL;
				nmatch = preg.re_nsub;
				
				pmatch =(regmatch_t*)malloc(sizeof (*pmatch) * nmatch+1);
				if (pmatch)
				{
					match = regexec (&preg, str_request, nmatch, pmatch, 0);
					regfree (&preg);
					if (match == 0)
					{
						char* expression=NULL;

						int start = pmatch[0].rm_so;
						int end = pmatch[0].rm_eo;
						size_t size = end - start;
						expression =(char*)malloc(sizeof (*expression) * (size + 1));
						if (expression)
						{
							strncpy (expression, &str_request[start], size);
							expression[size] = '\0';
							supprime(expression,'<');
							supprime(expression,'>');
							supprime(expression,'/');
							supprime(expression,'"');
							supprime(expression,';');
							supprime(expression,'\'');
							cout<<"expression : "<<expression<<endl;
							free(pmatch);
                                                        free (expression);
							return(expression);						
						}
						free (expression);
					}
				}
				else
				{
					fprintf (stderr, "Memoire insuffisante\n");
					exit (EXIT_FAILURE);
				}
				free(pmatch);
			}
		}
		fichier.close();
	}
	return("");
}

Que j'appelle par exemple pour récupérer les keywords :
myKey=returnFromFile(nomFichier,"(<meta [-_[:alnum:]]*name=\"keywords\"([-_[:print:]]*)\":print:*/>)");

je reçois bien ce qui correspond aux keywords mais aussi avec les valeurs "meta name=keywords content=......" , alors que seul les valeurs de content m'intéressent, c'est à dire ce qui correspond à la deuxième parenthèse.
J'ai pas mal chercher et je ne suis pas parvenu à trouver comment ne récuperer que ce que je veux.
J'ai aussi besoin de ceci pour récupérer les url qui sont écrites de plusieurs façon différentes dans une page.

Je fais donc appel au savoir général pour si l'un(e) d'entre vous aurai une solution.

Un autre problème vient de la génération du nom de fichier dans lequel je place les temporairement le code, jusqu'à présent j'utilisais rand(), mais le problème est que le résultat, je crois,se base sur l'horloge interne et ceci me donne parfois des nom de fichier équivalent. ce qui génère quelques erreurs lorsque je revient sur le fichier.
Je vais rechercher une méthode pour obtenir un nom unique, mais si vous avez des idées, n'hésitez pas.

merci d'avance.

1 réponse

GNUmaster Messages postés 12 Date d'inscription lundi 21 juillet 2008 Statut Membre Dernière intervention 10 avril 2012
7 janv. 2009 à 22:53
Pour ce qui est de l'identifiant de fichier unique, je vais me contenter pour l'instant de l'url de la page, avec les caractères spéciaux en moins.
C'est pas parfais, mais bon.
0