remplacement de chaine: regexp.

Le
Mihamina (R12y) Rakotomandimby
Bonjour,
J'ai du code XHTML non valide en masse.
C'est esentiellement beaucoup de
<input xxxxxxxxx>
qui faut remplacer en
<input xxxxxxxxx />
dans xxxxxxx il peut y avoir tout ce que la norme permet qu'il y a,
c'est à dire des attributs et donc les caractères spéciaux qui en découlent.

Pour construire l'expression rationelle qui va matcher, je dis:
"les chaines contenant "<input " suivi de n'importe quel caractère sauf
">" jusqu'au premier ">" rencontré sont à remplacer par la meme chaine,
mais en insérant un "/" avant le ">".

Je ne sais meme pas comment batir la regexp
Un coup de main SVP
Je compte implémenter la chose en Perl ensuite.
Mais le suivi est d'abord proposé sur fcou.

Merci d'avance.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Stephane Chazelas
Le #771496
2007-09-25, 14:46(+02), Mihamina (R12y) Rakotomandimby:
Bonjour,
J'ai du code XHTML non valide en masse.
C'est esentiellement beaucoup de
<input xxxxxxxxx>
qui faut remplacer en
<input xxxxxxxxx />
dans xxxxxxx il peut y avoir tout ce que la norme permet qu'il y a,
c'est à dire des attributs et donc les caractères spéciaux qui en découlent.

Pour construire l'expression rationelle qui va matcher, je dis:
"les chaines contenant "<input " suivi de n'importe quel caractère sauf
">" jusqu'au premier ">" rencontré sont à remplacer par la meme chaine,
mais en insérant un "/" avant le ">".

Je ne sais meme pas comment batir la regexp...
Un coup de main SVP
Je compte implémenter la chose en Perl ensuite.
Mais le suivi est d'abord proposé sur fcou.
[...]


perl -pe 's,(<[^>]*[^>/])>,$1/>,g'

--
Stéphane

Luc.Habert.00__arjf
Le #771495
R12y :

Pour construire l'expression rationelle qui va matcher, je dis:
"les chaines contenant "<input " suivi de n'importe quel caractère sauf
">" jusqu'au premier ">" rencontré sont à remplacer par la meme chaine,
mais en insérant un "/" avant le ">".


(<input [^>]*)>

Paul Gaborit
Le #771494
À (at) Tue, 25 Sep 2007 14:46:24 +0200,
"Mihamina (R12y) Rakotomandimby"
J'ai du code XHTML non valide en masse.
C'est esentiellement beaucoup de
<input xxxxxxxxx>
qui faut remplacer en
<input xxxxxxxxx />
dans xxxxxxx il peut y avoir tout ce que la norme permet qu'il y a,
c'est à dire des attributs et donc les caractères spéciaux qui en
découlent.

Pour construire l'expression rationelle qui va matcher, je dis:
"les chaines contenant "<input " suivi de n'importe quel caractère
sauf ">" jusqu'au premier ">" rencontré sont à remplacer par la meme
chaine, mais en insérant un "/" avant le ">".


Ça donne (en syntaxe Perl) :

$code_XHTML_invalide =~
s{ # on substitue les chaînes
<input # contenant "<input "
([^>]*?) # puis n'importe quels caractères sauf ">"
# (mémorisés)
> # jusqu'au premier ">"
}{<input$1 />}gx; # on insère le / final

J'ai préfixé les '<', '>' par un backslash car ces caractères
risquent d'avoir un sens particulier dans les prochaines versions de
Perl.

--
Paul Gaborit - Perl en français -
Stephane Chazelas
Le #771493
2007-09-25, 16:52(+02), Paul Gaborit:
[...]
Ça donne (en syntaxe Perl) :

$code_XHTML_invalide =~
s{ # on substitue les chaînes
<input # contenant "<input "
([^>]*?) # puis n'importe quels caractères sauf ">"
# (mémorisés)
> # jusqu'au premier ">"
}{<input$1 />}gx; # on insère le / final

J'ai préfixé les '<', '>' par un backslash car ces caractères
risquent d'avoir un sens particulier dans les prochaines versions de
Perl.


C'est quelquechose dont tu aurais eu vent?

A mon avis, si quelquechose doit avoir un sens particulier dans
une prochaine version de perl, c'est plutot < et > que < ou >.
Chaque nouvelle version de perl est censée etre backward
compatible avec la precedente. Si une nouvelle version de perl
rendait < special, alors ca casserait des scripts. En revanche,
comme il n'y a aucune raison d'ecrire < aujourd'hui, les
auteurs de perl sont libre de l'utiliser comme signifiant
quelque chose de special dans une future version. Dans le doute,
on peut aussi utiliser [<], [>]. Note que le ? plus haut n'est
pas necessaire, ou alors, on peut ecrire: s{
--
Stéphane

Mihamina (R12y) Rakotomandimby
Le #771492
Paul Gaborit wrote:
$code_XHTML_invalide =~
s{ # on substitue les chaînes
<input # contenant "<input "
([^>]*?) # puis n'importe quels caractères sauf ">"
# (mémorisés)
> # jusqu'au premier ">"
}{<input$1 />}gx; # on insère le / final


Comme j'ai cherché en même temps, j'ai abouti à ceci:
http://svn.infogerance.us/code/browser/Mixid/trunk/replace-ids.pl
http://svn.infogerance.us/code/browser/Mixid/trunk/replace-img.pl
http://svn.infogerance.us/code/browser/Mixid/trunk/replace-input.pl

le fichier initial invalide:
http://svn.infogerance.us/code/browser/Mixid/trunk/mini.html?revF

C'est clair que c'est pas optimal et trop décomposé, mais je prefere
bien decomposer.

Nicolas George
Le #771491
Stephane Chazelas wrote in message
A mon avis, si quelquechose doit avoir un sens particulier dans
une prochaine version de perl, c'est plutot < et > que < ou >.


Non, c'est une garantie explicitement donnée, avec beaucoup d'emphase, que
machin matche toujours le machin littéral dès que machin n'est pas un
caractère alphanumérique. Ça permet à quotemeta de fonctionner fiablement.

mpg
Le #771490
Le (on) mardi 25 septembre 2007 18:12, Stephane Chazelas a écrit (wrote) :
A mon avis, si quelquechose doit avoir un sens particulier dans
une prochaine version de perl, c'est plutot < et > que < ou >.


Euh, un rien hors-sujet, mais je déduis de la phrase précédente que < et >
ne sont pas les symboles de début et fin de mot en perl. Comment note-t-on
donc le début et la fin de mot en perl ?

Manuel.

Nicolas George
Le #771240
R12y wrote in message
C'est esentiellement beaucoup de
<input xxxxxxxxx>
qui faut remplacer en
<input xxxxxxxxx />


xmllint --html --xmlout

Nicolas George
Le #771239
mpg wrote in message
Euh, un rien hors-sujet, mais je déduis de la phrase précédente que < et >
ne sont pas les symboles de début et fin de mot en perl. Comment note-t-on
donc le début et la fin de mot en perl ?


b pour les deux. À combiner avec un look-ahaed/look-behind si le mot
délimité n'est pas dans l'expression rationnelle. Cf. perlre(1) pour les
détails.

Emmanuel Florac
Le #771236
Le Tue, 25 Sep 2007 14:46:24 +0200, Mihamina (R12y) Rakotomandimby a
écrit :


Je ne sais meme pas comment batir la regexp... Un coup de main SVP
Je compte implémenter la chose en Perl ensuite. Mais le suivi est d'abord
proposé sur fcou.


1) on ne peut pas et ne doit pas parser un format comme le HTML ou le XML
avec des regexp, ça ne marche pas.
2) HTML Tidy fait ce que tu veux, très bien et tout seul.
3)Si tu tiens à le faire depuis Perl, il y a le module éponyme:
http://search.cpan.org/~petdance/HTML-Tidy-1.08/lib/HTML/Tidy.pm

--
Les défauts n'apparaissent qu'après que le programme a passé (avec
succès) la phase d'intégration.
Loi de Klipstein.

Publicité
Poster une réponse
Anonyme