correcteur HTML

correcteur HTML - PHP - Programmation

Marsh Posté le 06-07-2005 à 14:24:54    

Bonjour,
 
Voila, je suis en train de développer un outil qui analyse des pages HTML. L'outil fonctionne pas trop mal, mais perd un peu les pédales avec des pages internet malformées, càd où les balises ouvertes ne sont pas correctement fermées.
 
Je cherche donc un petit outil en php qui fermerrait les balises de maniere intelligente, à la manière de firefox. En effet, si je sauvegarde une page HTML avec firefox, le code est corrigé, et mon outil fonctionne correctement.
 
Merci.

Reply

Marsh Posté le 06-07-2005 à 14:24:54   

Reply

Marsh Posté le 06-07-2005 à 14:32:10    

Firefox ferme les balises non fermées ? C'est nouveau ca  :??:


---------------
http://www.alsacreations.com , http://www.openweb.eu.org. Mon CV : http://cv.roane-irkana.net/. Exemple à ne surtout pas suivre : www.worldinternet.be
Reply

Marsh Posté le 06-07-2005 à 14:33:19    

avec PHP, il faudrait utiliser les regex.
par exemple un preg_match qui, si il retourne 'false' enchaine sur un preg_replace complétant la chaine en fermant la balise en question
 
du style (if !preg_match('$ma_regex', $ma_chaine))
(
preg_replace($ma_regex,$correction,$ma_chaine);
)
 
(je n'ai toujours pas trouvé la touche pour faire des accolades sur MAC :D)
 
donc ici la regex recherche une balise ouvrante + fermante, et le replace ferme au cas échéant

Reply

Marsh Posté le 06-07-2005 à 14:35:56    

plainsofpain a écrit :

Firefox ferme les balises non fermées ? C'est nouveau ca  :??:


 
Disons plutot qu'il essais de fonctionner avec des balises incorrectement fermées mais on peut pas vraiment dire qu'"il les fermes"
 
 

remizz a écrit :

(je n'ai toujours pas trouvé la touche pour faire des accolades sur MAC :D)


 
Allez je suis sur que ca doit se faire avec "pomme", lol on peut tout faire avec un pomme sur mac...


Message édité par dwogsi le 06-07-2005 à 14:36:19

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 06-07-2005 à 14:52:26    

dwogsi a écrit :


 
 
 
 
Allez je suis sur que ca doit se faire avec "pomme", lol on peut tout faire avec un pomme sur mac...


 
Trouvé {{{ c'est avec alt :D et j'essayais avec pomme (qui est à la place du alt gr) !

Reply

Marsh Posté le 06-07-2005 à 14:58:41    

alala ces mac.... C'est un portable?


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 06-07-2005 à 15:07:39    

non pas vraiment, mais je sais pas trop ce que c'est (je suis en stage ), surement un G4 (avec écran 21' :D)

Reply

Marsh Posté le 06-07-2005 à 15:25:41    

a oui quand même un belle bête mais bon j'aime pas trop les mac, préfére pc avec unix bien entendu!
:)


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 13-07-2005 à 17:33:57    

Rebonjour,
Utiliser les expressions régulières pour coriger les balises non fermée a effectivement fonctionné. Le site qui posait problème se laisse analyser sans soucis.
Malheureusement, je suis confronté a un autre problème maintenant. Ce n'est plus avec les balises non fermés, mais avec les attributs des balises non protégées par des doubles quotes que mon moteur d'analyse se casse les dents.
Encore une fois, si je sauvegarde la page avec Firefox et que j'analyse la page sauvegardée, plus de problème !!
Ok, je pourrais à nouveau régler le problème des attributs non 'quotées' à l'aide d'expression régulière mais j'ai quand meme peur que sur un autre site, ce ne sera plus ni les balises, ni les attributs des balises, mais encore autre chose qui fera planter mon moteur.
L'idéal, ce serait un outil qui fasse à peut pret la meme chose que Firefox, qui corrige de la même façon.
Alala, si tous les sites étaient conforme HTML ou XHTML, leur analyse serait tellement plus simple...

Reply

Marsh Posté le 21-07-2005 à 11:40:15    

remizz a écrit :

avec PHP, il faudrait utiliser les regex.
par exemple un preg_match qui, si il retourne 'false' enchaine sur un preg_replace complétant la chaine en fermant la balise en question
 
du style (if !preg_match('$ma_regex', $ma_chaine))
(
preg_replace($ma_regex,$correction,$ma_chaine);
)
 
(je n'ai toujours pas trouvé la touche pour faire des accolades sur MAC :D)
 
donc ici la regex recherche une balise ouvrante + fermante, et le replace ferme au cas échéant


Alors justement, j'ai un problème pour écrire cette regex en PHP : je n'arrive pas à trouver la syntaxe correcte pour décrire une séquence déjà trouvée.
 
Exemple simpliste. Je prends la chaîne suivante:

<html><body><strong></strong></body></html>

.
Je veux supprimer les balises vides (<xyz></xyz> ).
 
En PERL, on pourrait faire ceci :

s!<([^>]+)></\1>!!


Le \1 reprend le contenu de la sous chaîne capturée par la première paire de parenthèses (ici, strong).
 
Mais en PHP, impossible de trouver la syntaxe coorecte.
Il est bien possible de récupérer le contenu des parenthèses dans les chaînes de remplacement comme ceci :

echo preg_replace('([0-9]+)', 'N=\\1', 'azerty 123 WXYZ');


qui remplace "123" dans la chaîne par "N=123". Mais je n'arrive pas à faire ce que je veux en PHP.

echo ereg_replace('<([^>]+)></\\1>', '', '<html><body><strong></strong></body></html>');

ne modifie rien à la chaîne transmise.
 
Est-ce impossible en PHP ? Sinon, quelle est la bonne syntaxe ?

Reply

Marsh Posté le 21-07-2005 à 11:40:15   

Reply

Marsh Posté le 21-07-2005 à 11:53:27    

Y'a plus simple que tout ce bordel : http://www.php.net/manual/en/ref.tidy.php ;)

Reply

Marsh Posté le 21-07-2005 à 12:37:23    


Merci pour l'info, mais ça ne répond pas à ma question sur les regex. Et puis ce que je veux faire n'est pas aussi compliqué qu'un correcteur HTML. Il suffirait que ma regex fonctionne. En attendant, je vais passer par un system("perl ..." ). C'est un peu gruik, mais bon...

Reply

Marsh Posté le 21-07-2005 à 14:04:06    

je plussoie FlorentG, avec tidy ça roule tt seul

Reply

Marsh Posté le 21-07-2005 à 14:06:48    

Toucouch a écrit :

echo ereg_replace('<([^>]+)></\\1>', '', '<html><body><strong></strong></body></html>');

ne modifie rien à la chaîne transmise.
 
Est-ce impossible en PHP ? Sinon, quelle est la bonne syntaxe ?


 
Ce n'est pas impossible en PHP. En rajoutant un délimiteur (comme '%' par exemple) et en utilisant la fonction preg_replace, cela fonctionne :  

echo preg_replace('%<([^>]+)></\\1>%','','<html><body><strong></strong></body></html>');


 
 


Ouais, c'est cool ça. Je vais me pencher sérieusement dessus, mais à mon avis, ca peut le faire  :)
 

Reply

Marsh Posté le 21-07-2005 à 14:08:21    

Ce qu'il faut aussi faire, c'est corriger les éléments interdits dans d'autres (par exemple, pas de <p> dans un <a> ), et là ça devient compliqué, d'où l'utilisation de tidy...

Reply

Marsh Posté le 21-07-2005 à 15:06:43    

FlorentG a écrit :

Ce qu'il faut aussi faire, c'est corriger les éléments interdits dans d'autres (par exemple, pas de <p> dans un <a> ), et là ça devient compliqué, d'où l'utilisation de tidy...


Pas si tu interdis tout attribut dans les balises, à l'exception de href dans les liens... (Ce qui est mon cas.)

Reply

Marsh Posté le 21-07-2005 à 15:14:01    

Ah ok

Reply

Marsh Posté le 21-07-2005 à 16:53:59    

Pas moyen de la faire marcher la lib tidy.
Le module a bien compiler (installé avec pear -v install tidy), avec phpinfo(), il me dit bien que le module tidy est chargé, mais à partir du moment ou je fais un $tidy = new tidy, la le seul résultat est un message d'erreur qui me dit qu'il est impossible d'instancier une classe qui n'existe pas !!
Y a des instructions spéciales (style un fichier a loader) pour l'utiliser cette lib?

Reply

Marsh Posté le 27-07-2005 à 09:32:12    

C'est cool, j'ai réussi a faire fonctionner la librairie tidy. Elle fait exactement ce que je veus, elle corrige pas mal d'erreur qui faisait planté mon moteur  :)


Message édité par gratith le 27-07-2005 à 09:32:31
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed