Expression régulière...
Le
Cenekemoi
Bonjour,
n'étant pas au top sur les expressions régulières, j'en recherche une
qui me permettrait de vider des parties de texte compris entre deux
mot-clés.
Exemple classique avec les mot-clés '<' et '>' afin de retirer les
balises Html : new RegExp("<[^>]*>", "g");
J'aimerais que les deux caractères < et > ci-dessus soient libres, par
exemple: _DEB_ et _FIN_ mais j'ai du mal à ce que tout fonctionne bien.
Mon essai (en m'inspirant de l'exemple ci-dessus):
<script>
var _H1_ = "_DEB_",_H2_ = "_FIN_";
exp = _H1_ +'link rel="stylesheet" href="../styles/drill_print.css"
type="text/css" media="print"'+ _H2_;
exp+= _H1_ +'style'+ _H2_ +'body,td { font-family: Arial; font-size:
9px;}';
exp+= _H1_ +'/style'+ _H2_;
exp+= _H1_ +'/head'+ _H2_;
exp+= _H1_ +'body onload="onLoad();onLoadTest()"'+ _H2_ +'thierry';
exp+= _H1_ +'/body'+ _H2_;
var reg = new RegExp(_H1_ +"[^"+ _H2_ +"]*"+ _H2_, "g");
alert( exp.replace(reg,"") );
</script>
Résultat:
_DEB_link rel="stylesheet" href="../styles/drill_print.css"
type="text/css" media="print"_FIN_body,td { font-family: Arial;
font-size: 9px;}thierry
C'est lié a priori au caractère "_" dans "drill_print", mais ça ne
m'avance guère.
Des idées ?
Merci d'avance
--
Cordialement, Thierry ;-)
n'étant pas au top sur les expressions régulières, j'en recherche une
qui me permettrait de vider des parties de texte compris entre deux
mot-clés.
Exemple classique avec les mot-clés '<' et '>' afin de retirer les
balises Html : new RegExp("<[^>]*>", "g");
J'aimerais que les deux caractères < et > ci-dessus soient libres, par
exemple: _DEB_ et _FIN_ mais j'ai du mal à ce que tout fonctionne bien.
Mon essai (en m'inspirant de l'exemple ci-dessus):
<script>
var _H1_ = "_DEB_",_H2_ = "_FIN_";
exp = _H1_ +'link rel="stylesheet" href="../styles/drill_print.css"
type="text/css" media="print"'+ _H2_;
exp+= _H1_ +'style'+ _H2_ +'body,td { font-family: Arial; font-size:
9px;}';
exp+= _H1_ +'/style'+ _H2_;
exp+= _H1_ +'/head'+ _H2_;
exp+= _H1_ +'body onload="onLoad();onLoadTest()"'+ _H2_ +'thierry';
exp+= _H1_ +'/body'+ _H2_;
var reg = new RegExp(_H1_ +"[^"+ _H2_ +"]*"+ _H2_, "g");
alert( exp.replace(reg,"") );
</script>
Résultat:
_DEB_link rel="stylesheet" href="../styles/drill_print.css"
type="text/css" media="print"_FIN_body,td { font-family: Arial;
font-size: 9px;}thierry
C'est lié a priori au caractère "_" dans "drill_print", mais ça ne
m'avance guère.
Des idées ?
Merci d'avance
--
Cordialement, Thierry ;-)

Poser une question


1) Syntaxe JavaScript
---------------------
Tu peux simplifier l'écriture en écrivant :
/<[^>]*>/g
au lieu de :
new RegExp("<[^>]*>", "g")
Bien entendu ça ne marchera que si l'expression ne contient pas de
« / », mais elle peut à priori contenir des « " ».
2) Expressions régulières PCRE
------------------------------
Tu peux simplifier l'expression en écrivant :
new RegExp(" ou bien sûr :
/
(U = Ungreedy = non gourmand, ce qui signifie que l'expression prend le
plus petit motif qui marche au lieu d'aller chercher le plus grand).
Pour des *caractères* différents de < et > cela devrait marcher pareil,
mais pas pour des *chaînes de caractères*.
En effet, avec "_DEB_[^_FIN_]*_FIN_" et la chaîne "_DEB_ MACHIN _FIN_",
le I et le N de MACHIN arrêteront la recherche avant d'aller jusqu'à ton
_FIN_.
En revanche, RegExp("_DEB_.*_FIN", "gU") devrait fonctionner.
Tu dois comprendre que [_FIN_] et [^_FIN_] matchent un seul caractère et
pas un mot. D'ailleurs [^_FIN_] est équivalent à [^____FFNI___IN].
Si le contenu à virer entre _DEB_ et _FIN_ peut s'étendre sur plus d'une
ligne, il faut rajouter l'option s (DOTALL) ou ça ne marchera pas :
new RegExp("_DEB_.*_FIN", "gUs");
En reprenant ton code, cela donnera donc :
<script>
var _H1_ = "_DEB_",_H2_ = "_FIN_";
exp = [...]
var reg = new RegExp(_H1_ + ".*" + _H2_, "gUs");
alert(exp.replace(reg, ""));
</script>
Oui, merci, je le sais ; je le mettais sous cette forme pour être plus
proche du code que je proposais (avec le "
Désolé, Olivier, mais je te rappelle que PCRE = Perl Compatible Regular
Expressions.
Si tu utilises le genre d'expression ci-dessus en *javascript*, sous FF
tu obtiens le message :
"invalid regular expression flag U"
...et une erreur de syntaxe sous IE.
Normal, Javascript n'est pas compatible PERL...
--
Cordialement, Thierry ;-)
Ben mince alors ! On m'aurait menti ?
Citation du « Standard ECMA-262, 3rd Edition - December 1999 » intitulé
« ECMAScript Language Specification », chapitre 15.10 :
-----------------------------------------------------------------------
The form and functionality of regular expressions is modelled after the
regular expression facility in the Perl 5 programming language.
-----------------------------------------------------------------------
Note que tout n'est pas perdu. Même si le flag U n'est pas reconnu, la
syntaxe « *? » doit fonctionner pour faire la même chose :
new RegExp("_DEB_.*?_FIN_", "gs");