C++ : expression régulières et sous-chaine.
GNUmaster
Messages postés
14
Statut
Membre
-
GNUmaster Messages postés 14 Statut Membre -
GNUmaster Messages postés 14 Statut Membre -
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 :
Que j'appelle par exemple pour récupérer les keywords :
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.
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.