Me revoilà, vêtu de la tenue appropriée pour une autopsie de mon propre cadavre et dont voici les viscères :
Code : Tout sélectionner
Local $res = StringRegExpReplace($_String, "(?i)\s*+([^<]*?)(?=\s*+$|\s*+<span)(<span.*?</span>)?", '<span class="C2">$1</span>$2')
$res = StringReplace($res, '<span class="C2"></span>', '')
Pour le pattern du Replace :
(?i) = option "insensible à la casse"
\s*+ = avale d'éventuels blancs en tête (ou répétition) sans les relâcher (le + après * est le "possessive quantifier" de Friedl = pas de backtracking sur cette répétition *, c'est un cliquet vers l'avant)
( = début de capture (ce sera $1)
[^<]*? = toute suite de caractères qui ne soit pas <, limitée par le quantifier ? à la plus petite chaîne (aussi appelé non-greedy)
) = fin de capture
On a donc capturé en $1 un mot "entre les <span...> texte </span>. Comme cette chaîne peut être vide, le remplacement qu'on va faire (voir plus bas) créera une instance de C2 sans texte. A priori on pourrait peut-$etre laisser ainsi, mais selon la sémantique de la classe C2 cela pourrait avoir une incidence parasite. C'est la raison pour laquelle il vaut mieux faire un StringReplace ensuite pour éjecter d'éventuelles instances de C2 vides. Cette digression faite, on continue car le morceau précédant est qualifié par ce qui suit.
(?= = le pattern précédent doit être suivi de (c'est un "lookahead")
\s*+$ = d'éventuels blancs avalés (avec cliquet) suivi de la fin de la chaîne sujet
| = ou bien
\s*+<span = d'éventuels blancs avalés (avec cliquet) suivi de <span
) = fin de condition vers l'avant (lookahead)
C'est cette condition-là qui préserve les <span...> texte </span> préexistants dans le sujet
On n'en n'a pas encore fini, car il faut bien les retrouver dans le résultat ces <span... "natifs", donc :
( = début de capture (ce sera $2)
<span.*?</span> = ce pattern correspond à un span "natif". Ici le qualifier ? est encore notre copain "non-greedy"
)? = fin de capture, rendue optionnelle par ? (attention, ce n'est pas le même ? que celui qui précède, c'est ici l'équivalent de {0,1}
La partie remplacement devrait maintenant être claire.
Pour les gens que les regexp chatouillent, le document le plus complet est la version html de la doc contenue dans l'archive des sources de PCRE,
accessible ici en https. Prenez la dernière version (8.21 à ce jour), pas la peine de finasser et de chercher quelle version exacte AutoIt utilise car les différences dépassent de beaucoup les besoins d'utilisateurs lambda comme nous, d'autant plus que la plupart des releases intermédiaires sont des fixes.
Pour info, une interface PCRE 16-bit est en cours de finalisation. Pour l'instant, PCRE ne traite que de l'UTF-8 MAIS ATTENTION, le support Unicode (UCP) n'est pas présent dans la compilation d'AutoIt. Il n'est donc pas possible aujourd'hui d'employer les méta-caractères de propriétés Unicode sous AutoIt.
Corollaire : \w ne matche pas é ni ç ni aucun caractère > 0x80.
Si des détails vous tracassent, vous empêchent de dormir ou plus simplement vous interpellent, dites-le !
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.