Recherche d'erreurs dans un fichier HTML avec C
MHIKAWOLFAK-47
-
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
J'ai un projet de la fac, on nous demande d'ouvrir un fichier HTML et détecter les fautes d'orthographe de tous les balises utilisées dans ce fichier, détecter l'omission ou l'oubli des balises fermantes ou ouvrantes.
Ouvrir un fichier je connais mais les opérations ça me dépasse !
Svp, aidez-moi ?
J'ai un projet de la fac, on nous demande d'ouvrir un fichier HTML et détecter les fautes d'orthographe de tous les balises utilisées dans ce fichier, détecter l'omission ou l'oubli des balises fermantes ou ouvrantes.
Ouvrir un fichier je connais mais les opérations ça me dépasse !
Svp, aidez-moi ?
Configuration: Android / Chrome 56.0.2924.87
A voir également:
- Recherche d'erreurs dans un fichier HTML avec C
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
3 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour, n'as-tu pas été formé pour réaliser cela? comment cela peut-il te dépasser? de quelle formation s'agit-il?
Salut MHIKAWOLFAK,
De la façon dont tu as formulé le sujet de l'exercice on peut comprendre de multiples choses. Si tu dois vérifier que la syntaxe d'un document HTML est valide, alors tu as beaucoup de travail car cela suppose que ton programme implémente toute la syntaxe du standard HTML, avec tous les tags html existants, leur syntaxe propre,...
Il y a des bibliothèque qui font cela, elles ne sont pas triviales et les réaliser dans le cadre d'un exercice me semble démesuré (à moins qu'on te demande juste de les utiliser) :
https://www.html-tidy.org/
Si ton exercice est beaucoup plus limité que ton message ne le laisse penser et, par exemple, se limite à vérifier qu'une balise ouvrante dans le code HTML contient une balise fermante, que cette balise existe ou non dans le standard, ou quelque soit le contenu de la balise, et sans que tu aies à vérifier si une balise peut en contenir une autre ou peut se chevaucher avec une autre, que ce n'est pas très compliqué.
Cela doit être indiqué par ton énoncé. La première chose est de bien comprendre celui-ci et tu auras déjà fait une partie importante de ton travail, et si ton énoncé n'est pas suffisamment précis, demande des précisions à ton enseignant.
Dal
De la façon dont tu as formulé le sujet de l'exercice on peut comprendre de multiples choses. Si tu dois vérifier que la syntaxe d'un document HTML est valide, alors tu as beaucoup de travail car cela suppose que ton programme implémente toute la syntaxe du standard HTML, avec tous les tags html existants, leur syntaxe propre,...
Il y a des bibliothèque qui font cela, elles ne sont pas triviales et les réaliser dans le cadre d'un exercice me semble démesuré (à moins qu'on te demande juste de les utiliser) :
https://www.html-tidy.org/
Si ton exercice est beaucoup plus limité que ton message ne le laisse penser et, par exemple, se limite à vérifier qu'une balise ouvrante dans le code HTML contient une balise fermante, que cette balise existe ou non dans le standard, ou quelque soit le contenu de la balise, et sans que tu aies à vérifier si une balise peut en contenir une autre ou peut se chevaucher avec une autre, que ce n'est pas très compliqué.
Cela doit être indiqué par ton énoncé. La première chose est de bien comprendre celui-ci et tu auras déjà fait une partie importante de ton travail, et si ton énoncé n'est pas suffisamment précis, demande des précisions à ton enseignant.
Dal
une balise ouvrante est du texte entre chevrons.
à partir de là :
-
-
(c'est une balise inventée, qui n'existe pas en HTML)
Si tu n'as pas à vérifier si la balise existe en HTML, un exemple de procédure simpliste serait de :
a- parcourir le contenu en texte du fichier
b- lorsque tu trouves un chevron
c- parcourir la suite jusqu'au prochain
d- lorsque tu trouves une chaîne
tu peux aussi vérifier qu'une balise fermante ne se trouve pas au milieu d'une balise ouvrante, et inversement, et qu'une fois un chevron
tu peux aussi noter les numéros de ligne où se trouvent les balises pour donner des messages d'erreur y faisant référence, etc.
à partir de là :
-
<dutexte>serait une balise ouvrante de
-
</dutexte>qui en serait la balise fermante correspondante
(c'est une balise inventée, qui n'existe pas en HTML)
Si tu n'as pas à vérifier si la balise existe en HTML, un exemple de procédure simpliste serait de :
a- parcourir le contenu en texte du fichier
b- lorsque tu trouves un chevron
'<'de noter que tu as une nouvelle balise
c- parcourir la suite jusqu'au prochain
'>'en notant les caractères entre les deux qui formeront le nom de ta balise, que tu peux mémoriser dans une structure de données (par un exemple un tableau de chaînes, une liste chaînée,...) et en arrêtant le nom de la balise au premier espace ou caractère blanc trouvé pour le cas où la balise HTML a des attributs (par exemple
<a href="https://www.commentcamarche.net">Visitez www.commentcamarche.net !</a>) : ici la balise est en réalité
<a>...
d- lorsque tu trouves une chaîne
"</"parcourir la suite jusqu'au prochain
'>'en notant les caractères entre les deux qui formeront le nom de ta balise fermante. Une fois que tu dispose du nom de la balise fermante, tu retires ce nom de la liste mentionnée en d- en commençant par la fin de la liste, s'il s'y trouve
tu peux aussi vérifier qu'une balise fermante ne se trouve pas au milieu d'une balise ouvrante, et inversement, et qu'une fois un chevron
'<'ou
"</"est trouvé, que tu as bien un chevron
'>'qui le termine ...
tu peux aussi noter les numéros de ligne où se trouvent les balises pour donner des messages d'erreur y faisant référence, etc.
Voici le code que j'ai taper, il est sensé compter le nombre des balises mais je crois qu'il y a des erreurs !
#include<stdio.h> #include<stdlib.h> int main() { static const char filename[128] ; printf("Tapez le nom et l'extention de votre fichier : "); scanf("%s", &filename); FILE *file = fopen(filename, "r"); if(file!=NULL) { int balise=0; int i=0; char line[200]; fgets(line, sizeof line,file); if((line[0] || line[1] || line[2] =='<') && line[1] || line[2] || line[3] !='</' ) { while(fgets(line, sizeof line, file) != NULL) { balise+=1; printf("%s",line); } printf("\n"); printf("vous avez utiliser %d balises parents et enfants dans ce fichier\n",balise); } } fclose(file); }
Relis mon message attentivement pour poster ton code correctement sur le forum la prochaine fois. Là, il est quasiment illisible car tu n'as pas indiqué le langage c dans la balise de code du forum (tu as utilisé une balise <code> et non pas une balise <code c>).
Ensuite, tu n'as pas non plus suivi mes indications sur le descriptif d'un algorithme simple, ni celle sur la fonction standard C de lecture la plus simple que tu pourrais utiliser. Ce n'est pas le plus grave, car tu as le droit de te compliquer la vie, et, de toutes façons, il n'y a pas qu'une seule façon de faire (et, en plus, tu fais, en fin de compte quelque chose de différent par rapport à ce que tu disais au début, puisque tu ne cherches plus des "erreurs", mais, désormais, tu comptes les balises) et toi au d'autres pourront trouver de meilleures manières :-)
Sur ton code.
Sur le plan de la syntaxe ce que tu compares dans ton if ne fait sans doutes pas ce que tu penses.
En C,
- si
- ou si
- ou si si
Dans la comparaison qui suit les
Ce qui suit dans la comparaison a les mêmes problèmes que ceux déjà expliqués. Avec le problème supplémentaire
Il a dû te signaler aussi que tu définissais
Utilise les messages d'avertissements du compilateur (avec le compilateur
Sur le plan de l'algorithme, si on devine ce que tu essayes de faire, ton raisonnement est faux. Les balises HTML peuvent se trouver n'importe où sur une ligne, pas uniquement en début de ligne.
Bonne chance pour la suite.
Ensuite, tu n'as pas non plus suivi mes indications sur le descriptif d'un algorithme simple, ni celle sur la fonction standard C de lecture la plus simple que tu pourrais utiliser. Ce n'est pas le plus grave, car tu as le droit de te compliquer la vie, et, de toutes façons, il n'y a pas qu'une seule façon de faire (et, en plus, tu fais, en fin de compte quelque chose de différent par rapport à ce que tu disais au début, puisque tu ne cherches plus des "erreurs", mais, désormais, tu comptes les balises) et toi au d'autres pourront trouver de meilleures manières :-)
Sur ton code.
Sur le plan de la syntaxe ce que tu compares dans ton if ne fait sans doutes pas ce que tu penses.
En C,
(line[0] || line[1] || line[2] =='<')signifie, pour le compilateur C :
- si
line[0]est évalué à vrai (ce qui sera le cas si
line[0]contient autre chose que
'\0'...
- ou si
line[1]est évalué à vrai (même remarque)
- ou si si
line[2]est égal au caractère littéral
'<'...
Dans la comparaison qui suit les
&&, comme tu ne mets pas de parenthèses, le
&&ne sera appliqué qu'à l'opérande suivante.
Ce qui suit dans la comparaison a les mêmes problèmes que ceux déjà expliqués. Avec le problème supplémentaire
line[3] !='</'qui doit t'être signalé en avertissement par ton compilateur, puisque tu mets deux caractères littéraux entre apostrophes, ce qui n'a pas de sens.
Il a dû te signaler aussi que tu définissais
filenamecomme une
constalors que tu en modifies le contenu avec
scanf().
Utilise les messages d'avertissements du compilateur (avec le compilateur
gcc, vérifie que l'option de compilation
-Wall, qui signifie "Warnings all", est bien utilisée) pour t'aider à corriger ton code.
Sur le plan de l'algorithme, si on devine ce que tu essayes de faire, ton raisonnement est faux. Les balises HTML peuvent se trouver n'importe où sur une ligne, pas uniquement en début de ligne.
Bonne chance pour la suite.
Vous m'aider beaucoup, tout d'abord merci pour tout jusque là.
Mais j'ai encore un petit soucis ;
J'aimerais cette fois-ci vérifier si une portion du contenu d'un fichier (HTML) se trouve dans un autre fichier (txt)!
J'ai ouvert les deux fichiers puis j'essaie de le faire avec la fonction strstr de la bibliothèque string.h
Voilà le code;
<code c>
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *file1=fopen("priva.html","r");
FILE *file2=fopen("list_balise.txt","r");
char LF1 =fgets(ligneF,sizeof ligneF,file1);
char LF2 = fgets(ligneB,sizeof ligneB,file2);
while(LF1!=NULL && LF2 !=NULL)
{
char verif=strstr(LF2,LF2);
if(verif!=NULL)
{
printf("%s",verif);
printf("\t cette balise est dans la liste");
}
}
return 0;
}
</code c>
Mais j'ai encore un petit soucis ;
J'aimerais cette fois-ci vérifier si une portion du contenu d'un fichier (HTML) se trouve dans un autre fichier (txt)!
J'ai ouvert les deux fichiers puis j'essaie de le faire avec la fonction strstr de la bibliothèque string.h
Voilà le code;
<code c>
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *file1=fopen("priva.html","r");
FILE *file2=fopen("list_balise.txt","r");
char LF1 =fgets(ligneF,sizeof ligneF,file1);
char LF2 = fgets(ligneB,sizeof ligneB,file2);
while(LF1!=NULL && LF2 !=NULL)
{
char verif=strstr(LF2,LF2);
if(verif!=NULL)
{
printf("%s",verif);
printf("\t cette balise est dans la liste");
}
}
return 0;
}
</code c>
Si tu veux m'aider alors n'hésite pas !