Rechercher : dans
Par :

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

Dernière réponse le 7 jan 2009 à 22:53:29 GNUmaster, le 7 jan 2009 à 22:17:43 
 Signaler ce message aux modérateurs

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.
Configuration: Gentoo Linux
Firefox 3.0.5

Meilleures réponses pour « C++ : expression régulières et sous chaine. » dans :
PHP - Expressions régulières Voir Qu'est-ce qu'une expression régulière? Les expressions régulières sont des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de caractères, c'est-à-dire permettant de trouver les portions de la chaîne correspondant au...
[RegExp] Récupérer une adresse IP VoirFinalité Mise en œuvre Explications Interprétation du motif Récupérer une adresse IP Finalité Pour récupérer une IP dans un fichier texte, fichiers journaux, pages web, etc. Mise en œuvre L'expression régulière suivante combinée à la...
Liste simplement chaînée VoirLISTES SIMPLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes chaînées A. Initialisation B. Insertion d'un élément dans la liste 1. Insertion...
Liste doublement chaînée VoirLISTES DOUBLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes doublement chaînées A. Initialisation B. Insertion d'un élément dans la liste 1....
Langage C - Les listes chaînées VoirLa notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...

1

 GNUmaster, le 7 jan 2009 à 22:53:29

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.

Répondre à GNUmaster
Collection CommentÇaMarche.net