Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

remplacement de chaine: regexp.

16 réponses
Avatar
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.

10 réponses

1 2
Avatar
Stephane Chazelas
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

Avatar
Luc.Habert.00__arjf
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 [^>]*)>

Avatar
Paul Gaborit
À (at) Tue, 25 Sep 2007 14:46:24 +0200,
"Mihamina (R12y) Rakotomandimby" écrivait (wrote):
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 - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Stephane Chazelas
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{<input (.*?)>}...

--
Stéphane

Avatar
Mihamina (R12y) Rakotomandimby
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.

Avatar
Nicolas George
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.

Avatar
mpg
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.

Avatar
Nicolas George
R12y wrote in message <fdavuv$em0$:
C'est esentiellement beaucoup de
<input xxxxxxxxx>
qui faut remplacer en
<input xxxxxxxxx />


xmllint --html --xmlout

Avatar
Nicolas George
mpg wrote in message <fdbi1p$2uaa$:
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.

Avatar
Emmanuel Florac
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.

1 2