Remplacement avec RegExp [Résolu]

Signaler
Messages postés
209
Date d'inscription
samedi 11 novembre 2000
Statut
Membre
Dernière intervention
6 novembre 2009
-
Messages postés
209
Date d'inscription
samedi 11 novembre 2000
Statut
Membre
Dernière intervention
6 novembre 2009
-
Bonjour,
Je cherche depuis 1h comment remplacer une string par RegExp :
J'ai une fonction degrade(texte, color1, color2) qui me revois du texte traité.
Et j'aimerai remplacer dans une string, une expression de type [c=#6E5454]fdf/c=#D52C2C par le résultat de la fonction ... (texte=fdf, color1 = 6E5454, color2 = D52C2C)
Mais je ne sais pas comment m'y prendre

Merci de votre aide

32 réponses

Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
28
Salut,

Je ne comprends pas trop la question

Voici un pattern
\[c=#(?<Color1>[0-9A-F]{6})\](?<Texte>.*)\[/c=#(?<Color2>[0-9A-F]{6})\]

Dans Color1 --> 6E5454
Dans Color1 --> D52C2C
Dans Texte --> fdf

Les \[ et \] permet d'inhiber les []
et [0-9A-F]{6} --> 0à9 et AàF (exactement 6 fois)
.* --> n'importe quelle caractere
?<Color1> --> permet de nommer les extractions

Après pour utiliser avec javascript, fait une recherche

Bon dev
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
28
Source http://www.bennadel.com/blog/207-Ask-Ben-Extracting-Parts-Of-An-Email-Address-In-Javascript.htm

function GetEmailParts( strEmail ){
// Set up a default structure with null values
// incase our email matching fails.
var objParts = {
user: null,
domain: null,
ext: null
};

// Get the parts of the email address by leveraging
// the String::replace method. Notice that we are
// matching on the whole string using ^...$ notation.
strEmail.replace(
new RegExp( "^(.+)@(.+)\\.(\\w+)$" , "i" ),

// Send the match to the sub-function.
function( $0, $1, $2, $3 ){
objParts.user = $1;
objParts.domain = $2;
objParts.ext = $3;
}
);

* // Return the "potentially" updated parts structure.
* return( objParts );
* }
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
Bonjour,
>>par le résultat de la fonction
t'es sur ? ambigüe alors ton exemple !

apres=avant.replace( /ce que tu veux/gi, function($0)
         { $0 c'est l'occurence trouvée
           return ( ce que tu veux );
         }                 );

et [../auteur/NHERVAGAULT/84425.aspx nhervagault]++ il y a des caractères significatifs pour une expression 
                          régulièrecomme [ ] et autres * ? ... ( qui devraient te servir )

Cordialement [mon Site] [M'écrire] Bul
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
28
@Bul3 j'ai pas compris ta remarque
Merci d'etre plus explicite
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
euh... la remarque à propos de quoi ?
1° je disais que tu avais raison
   +1 quoi ... ou [../auteur/NHERVAGAULT/84425.aspx nhervagault]++
2° notre questionneur parle du résultat d'une fonction
    et son exemple est ambigüe car pas sûr que cela soit
    nécessaire d'en mettre une ( de fonction )
@+
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
28
OK, c'est la phrase suivante qui m'interrogeait ( qui devraient te servir )

Car mon expression réguliere est valide (du moins dans le moteur .NET)
mais les REGEXP sont compatibles sur les différentes plateformes (du moins les regexp de base)
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
ah.. le retour à la ligne intempestif !

il y a des caractères significatifs pour une expression 
régulière comme [ ] et autres * ? ... ( qui devraient te servir )
je parlais des caractères significatifs pour une
    expressions régulière [ ] *  ?  ....
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
en plus, je m'adressais à [../auteur/XELECTROX/471771.aspx XelectroX,][../auteur/XELECTROX/471771.aspx ]
[../auteur/XELECTROX/471771.aspx je sais que toi tu sais]
Messages postés
209
Date d'inscription
samedi 11 novembre 2000
Statut
Membre
Dernière intervention
6 novembre 2009

Donc ca me donnerait :
text=text.replace('\[c=#(?<color1>[0-9A-F]{6})\](?<texte>.*)\[/c=#(?<color2>[0-9A-F]{6})\]
', function($texte, $color1, $color2) );
C'est bien ça

Merci à tous
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
pas tout à fait tu veux le retour d'une fonction
fonction($0) { return (nimporte quoi); }
$0,$1... ce sont les occurences trouvées
exemple :

remplacer les "allo" impairs par "hé" et les pairs par "salut"

    <textarea id="txt">Allo par exemple allo, allo et encore ALLO</textarea>
    <script>
        var nb=0;
        var remp=["hé","salut"];
        document.getElementById("txt").value=
            document.getElementById("txt").value.replace
            (    /allo/gi,
                function($0)
                    { nb++;
                      return (remp[nb%remp.length]);
                    }
            );
    </script>

mais pas bien compris ce que tu cherches à remplacer par quoi ?
Messages postés
209
Date d'inscription
samedi 11 novembre 2000
Statut
Membre
Dernière intervention
6 novembre 2009

J'ai
quelquechose[c=#6E5454]fdf/c=#D52C2Cquelquechose
et je veux que ca donne
quelquechosefdfquelquechose.

Et ma focntion
degrade('text','6E5454','D52C2C') retourne
fdf

Je dois donc récupérer les informations et les passer en paramètres dans ma fonction
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
je commence à piger...

replace(/\[c=*\]*\/c=*\/gi, function($0)
    { $0 est donc = [c=#123456]fdf/c=#789012 si on prend ton exemple
      avec substring par exemple récupère les 3 zones nécessaires
      var z1=$0.substring(3,6); ....
      var ret= degrade( z2  ,z1 ,  z3 );
      return (  ret  );
   } );

sous réserve que /\[c=*\]*\/c=*\/gi, soit correct et corresponde à ce que tu veux !!?!
     pas testé et pas un spécialiste ( y'a pas qu'là diront beaucoup )
on peut, c'est sûr , améliorer très largement, faire autrement....
Messages postés
209
Date d'inscription
samedi 11 novembre 2000
Statut
Membre
Dernière intervention
6 novembre 2009

Oui voilà, c'est ca et c'est une bonne idée sauf que comment faire pour connaitre la longueur de ce qui ce trouve à l'intérieur des balises [c=...]/c=... et donc aussi comment connaître le début de z3 (color2) ?
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
la longueur n'est pas nécessairement à utiliser
regarde      indexof
   par exemple 
mais "tout" sur les string aussi   
chez selfHTML
Messages postés
209
Date d'inscription
samedi 11 novembre 2000
Statut
Membre
Dernière intervention
6 novembre 2009

Pas bête
En tout cas, merci pour tout, je vais enfin pouvoir y arriver
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
>>je vais enfin pouvoir y arriver
nickel.
Messages postés
209
Date d'inscription
samedi 11 novembre 2000
Statut
Membre
Dernière intervention
6 novembre 2009

Il me dit $0 est indéfini
Est-ce à cause du framework Prototype et de sa fonction $() ?
Messages postés
209
Date d'inscription
samedi 11 novembre 2000
Statut
Membre
Dernière intervention
6 novembre 2009

J'ai lu ca aussi :
In JavaScript, the special variable is called
RegExp.$##
(unless you are referencing it in the regular expression itself or handing it as the second argument to the
replace()
method). Since
RegExp
is a global object, you can access
RegExp.$1
,
RegExp.$2
, and so forth, from anywhere in the script. Note that
$1
and
$2
are local variables in Perl.
http://www.webreference.com/js/column5/values.html
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
oulah... s'il y a une bibliothèque de fonctions
( qu'on appelle très pompeusement framework ! )
je passe la main.
connais pas, tiens pas à connaitre, 100ko pour de la "présentation"...
( entr'autres )  je m'en passe.
mais tu dois avoir la bonne piste.....
Messages postés
209
Date d'inscription
samedi 11 novembre 2000
Statut
Membre
Dernière intervention
6 novembre 2009

Même sans, ca ne va pas , j'y comprends plus rien, est-ce à cause de Firefox ?