Voici une version corrigée de deux petites fautes de frappe et testée:
1 2 3 4 5 6 7 8
| $chaine = "<i>le chien</i> est très le <table><tr><td>petit</td><td>grand</td></tr></table>";
if ($chaine =~ />([^<]*)/ig) {
$motif = ">$1<";
$motif_repl = $motif;
$motif_repl =~ s/le/<b>le<\/b>/gi;
$chaine =~ s/$motif/$motif_repl/ig;
}
print $chaine; |
ce qui imprime:
<i><b>le</b> chien</i> est très le <table><tr><td>petit</td> <td>grand</td></tr></table>
Mais cela ne fera la substitution qu'une seule fois. S'il y a plusieurs "le" dans la phrase il faut faire une reconnaissance progressive (dans une boucle while, avec le modificateur "c").
Ici, j'ai ajouté arbitrairement deux "le" dans la phrase (qui n'a plus de sens, mais c'est juste pour démontrer le fonctionnement). J'ai aussi modifié l'expression régulière pour utiliser un quantificateur non gourmand au lieu d'une classe de caractère : /(>.+?<)/igc.
J'ai aussi mis un +? au lieu d'un *? comme quantificateur non gourmand pour optimiser (ne pas entrer inutilement dans la boucle pour une reconnaissance de "><").
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| $chaine = "<i>le chien</i> est très le <table><tr><td>petit</td><td>le grand</td></tr></table>";
while ($chaine =~ /(>.+?<)/igc) {
$motif = $1;
$motif_repl = $motif;
$motif_repl =~ s/le/<b>le<\/b>/gi;
if ($motif ne $motif_repl) {
push @mot, $motif;
push @mot_repl, $motif_repl;
}
}
while ($motif = pop @mot) {
$motif_repl = pop @mot_repl;
$chaine =~s/$motif/$motif_repl/gi;
}
print $chaine; |
Ce qui me donne:
<i><b>le</b> chien</i> est très <b>le</b> <table><tr><td>petit</td><td><b>le</b> grand</td></tr></table>
Partager