[Flash AS2_FP7] utiliser le split

ccciolll

Membre expert
Club iGen
Bonjour, j'essaye d'utiliser la fonction split pour découper un texte injecté dans mon flash.

Mes contraintes : utiliser actionscript2 et exporter en flash player 7, et surtout, je n'ai pas de VRAIE formation de programmeur, juste une formation de 3 jours il y a 10 ans (et ensuite 10 ans de pratique hasardeuse sur le tas).

Donc, je veux découper le texte complet en plusieurs morceaux de texte (texte normal et texte spécial), en utilisant des balises d'entrée et de sortie. Ici, les balises sont $ en entrée de texte spécial et § en sortie de texte spécial.

Voici le type de prog que j'ai tenté d'utiliser (la fonction champ_defini est une fonction que le formateur m'avait créée et qui sert à définir si un champ est vide ou pas) :

Bloc de code:
// découper l'ensemble, en fonction des balises, en variables "normales" et "spéciales"

if(champ_defini("TexteBalise"))
    {
    TexteNormal1 = TexteBalise.split('$')[0]
    TexteSuite1 = TexteBalise.split('$')[1]
    
    if(champ_defini("TexteSuite1"))
        {
        TexteSpecial1 = TexteSuite1.split('§')[0]
        TexteSuite2 = TexteSuite1.split('§')[1]
        
        if(champ_defini("TexteSuite2"))
            {
            TexteNormal2 = TexteSuite2.split('$')[0]
            TexteSuite3 = TexteSuite2.split('$')[1]
    
            if(champ_defini("TexteSuite3"))
                {
                TexteSpecial2 = TexteSuite3.split('§')[0]
                TexteNormal3 = TexteSuite3.split('§')[1]
                }
            }
        
        }
    
    }

Mon problème avec cette prog ?

Si j'envoie le texte
bonjour, $voici§ le texte $à découper§ selon les balises.

J'aimerais obtenir à la fin
TextNormal1 = bonjour,
TexteSuite1 = voici§ le texte $à découper§ selon les balises
TextSpecial1 = voici
TexteSuite2 = le texte $à découper§ selon les balises
TextNormal2 = le texte
TexteSuite3 = $à découper§ selon les balises
TexteSpecial2 = à découper
TexteNormal3 = selon les balises


Sauf que ma méthode ne marche pas bien.
En effet au lieu de
TexteSuite1 = voici§ le texte $à découper§ selon les balises
J'obtiens
TexteSuite1 = voici§ le texte
car la méthode split que j'utilise semble agir sur TOUTES les balises $ rencontrées, et pas uniquement sur la première.
y-aurait-il une façon d'écrire mon code pour qu'il prenne "tout le contenu de la variable compris entre la première balise rencontrée et la fin de la variable" et non pas "tout le texte de la variable compris entre la première et la deuxième balise".

Je soupçonne qqchose de très simple, probablement remplacer mon [1] par autre chose, mais déjà ce [1] ce n'est pas de moi, c'est une prog que j'avais trouvée ailleurs.
 
Dernière édition:
Bloc de code:
var my_str:String = "bonjour, $voici§ le texte $à découper§ selon les balises.";
var my_result:Array = new Array();

// découpe la chaine par les '$'
var my_array:Array = my_str.split("$");

// si la chaine ne commence pas par un '$' alors tu l'enlève de la table
if (! my_str.match("^\$")) {my_array[0].shift());}

// découpe la chaine par les '§'
for (var i = 0; i<my_array.length; i++) {
   my_result = my_array[i].split("§");
}

my_array devrait donc contenir :
[0] : voici
[1] : à découper

Cela dit, je ne connais pas l'action script. Il y a peut être de meilleurs méthodes pour le faire :D
 
Dernière édition:
La nuit porte conseil !
Je me suisdit que peut-être tout bêtement le [0] était ce qui se trouvait avant le 1ere balise, le [1] entre la 1ere et le 2eme blaise, le [2] entre la deuxième et la troisième, etc.

J'ai testé ça et en effet, c'était simplissime.

Du coup, j'ai procédé ainsi

Bloc de code:
// découper les textes après les $ pour obtenir le normal0 et les suites à découper

if(champ_defini("texteBalise"))
	{
	texteNormal0 = texteBalise.split('$')[0]
	texteSuite1 = texteBalise.split('$')[1]
	texteSuite2 = texteBalise.split('$')[2]
	}
	
// découper les suites obtenues (special§normal)
	
if(champ_defini("texteSuite1"))
	{
	texteSpecial1 = texteSuite1.split('§')[0]
	texteNormal1 = texteSuite1.split('§')[1]
	}
	
if(champ_defini("texteSuite2"))
	{
	texteSpecial2 = texteSuite2.split('§')[0]
	texteNormal2 = texteSuite2.split('§')[1]
	}

Et ça fonctionne (notez juste que j'ai, pour être dans la logique du split, nommé mon premier texte normal texteNormal0 au lieu de textenormal1 (et les autres dans la même logique).

Du coup, désolé Tucpasquic, tu as répondu pour rien. Il est possible que ta solution soit plus propre que celle que je vais utiliser, mais pour l'instant, celle que j'ai écrite à l'avantage que j'arrive à la comprendre (enfin à la comprendre un peu).
 
Ce que j'ai proposé, c'est qu'au lieu d'avoir un texteSpecial1, texteSpecial2, texteSpecial3&#8230; texteSpecial_n, tu stockes tout dans un tableau. Comme ça, quelque soit la longueur de la chaine, tu es sur de tout avoir.
Pour connaitre le nombre d'éléments que tu as entre tes balises, tu n'as qu'à faire un my_result.length

D'ailleurs, je viens remarquer que je me suis trompé ! Le résultat est stocké dans my_result, pas dans my_array !

Ton :
Bloc de code:
if(champ_defini("texteBalise"))
	{
	texteNormal0 = texteBalise.split('$')[0]
	texteSuite1 = texteBalise.split('$')[1]
	texteSuite2 = texteBalise.split('$')[2]
	}

est l'équivalent de
Bloc de code:
var my_array:Array = my_str.split("$");

à la différence que ton 'texteSuite{1,2,3&#8230;} est dans my_array

et ton re découpage est effectué dans
Bloc de code:
for (var i = 0; i<my_array.length; i++) {
   my_result = my_array[i].split("§");
}
 
Mais alors ensuite j'utilise quoi comme "nom de variable" pour plcer chaque éléments là où je veux le placer ?

Pour l'instant, effectivement je suis bloqué à un nombre de coupure limité, mais ça ne devrait pas gêner dans ma configuration.

Et surtout je retrouve ensuite mes variables avec des noms qui "me parlent" : TexteNormal0, TexteSpecial1, TexteNormal1, etc. que je n'ai plus ensuite qu'à "introduire" dans mes champs de texte dynamique.
 
Mais alors ensuite j'utilise quoi comme "nom de variable" pour plcer chaque éléments là où je veux le placer ?

Pour l'instant, effectivement je suis bloqué à un nombre de coupure limité, mais ça ne devrait pas gêner dans ma configuration.

Bloc de code:
my_result[n]
Ou x est l'nième élément de texte spécial de ta phrase (en commençant à 0 pour le premier). my_result est un tableau.


Et surtout je retrouve ensuite mes variables avec des noms qui "me parlent" : TexteNormal0, TexteSpecial1, TexteNormal1, etc. que je n'ai plus ensuite qu'à "introduire" dans mes champs de texte dynamique.

J'ai oublié TexteNormal dans ma partie :rose: mais ça s'ajoute facilement.

Si je comprends bien, à la fin tu veux afficher de nouveau l'ensemble de la phrase en (à priori) formatant différemment les parties encadrées des autres… ?
 
Ooooh !

Je ne connaissais pas cette notion de tableau. En effet ça peut avoir du style de le faire comme ça plutôt qu'à ma façon fruste.

En effet, tu as bien compris ce que j'avais cherché à faire. Une vue plus large de mon code se trouve ici.