Page 1 sur 1

découpage d'une chaine de caractères

Posté : 10 mai 2007, 17:13
par VaN
Bonjour,

J'aimerai modifier une chaine de caractère de ce type :

CAC40 6041.45 -10.18(-0.17%)

en quelque chose comme ça :

CAC40 6041.45 (-0.17%)

C'est a dire supprimer la 3e valeur, qui ne m'interesse pas.

Je connais un peu les différentes fonctions de modification de strings, mais je ne sais pas bien comment m'y prendre.

Selon moi il faudrait :
1. Placer le curseur juste avant le caractère '(' : assez facile j'imagine, il n'y en aura qu'un seul, quel que soit la chaine de départ.
2. Supprimer tous les caractères entre cette position et le premier caractère ' ', en remontant vers le début. Je préfère éviter de supprimer les caractères en fonction d'une longueur, vu que la valeur que je souhaite supprimer n'a pas une longueur fixe.

Comment dois-je m'y prendre, pour réaliser ça très simplement ?

Posté : 10 mai 2007, 18:05
par jpaul
Je ne suis pas spécialiste des expressions régulières mais que penses-tu de :
$V="CAC40 6041.45 -10.18(-0.17%) ";
echo "$V<hr>";
preg_match("@^(.*) (.*) (.*)(\(.*\)) @", $V, $res);
echo "<hr>";
echo $res[1]." ".$res[2]." ".$res[4];

Posté : 10 mai 2007, 18:11
par lem
Ce ne serait pas plus simple de jouer avec les séparateurs (espace puis "(") ?
Enfin, je dis ça, c'est juste que j'essaye souvent d'éviter les expressions régulières parce que je ne les maîtrise toujours pas :P

Posté : 10 mai 2007, 22:41
par jpaul
Ce ne serait pas plus simple de jouer avec les séparateurs (espace puis "(") ?
Ben c'est ce que je propose :
preg_match("@^(.*) (.*) (.*)(\(.*\)) @", $V, $res);
Du début à espace (non compris) -> $res[1]
espace précédent (non compris) au prochain espace (non compris) -> $res[2]
espace précédent (non compris) à la parenthèse (non comprise) -> $res[3]
parenthèse précédente (comprise) à la prochaine parenthèse (comprise) -> $res[4]
(On utilise pas res[3])
Je ne sais pas ce que tu entends par 'jouer avec les séparateurs' mais ça risque de prendre plus de lignes.
:wink:

Ceci dit, je viens de me rendre compte que j'ai un espace en trop à la fin, je pense que :
preg_match("@^(.*) (.*) (.*)(\(.*\))@", $V, $res); 
est préférable :oops: .

Posté : 11 mai 2007, 14:11
par lem
En fait je pensais à un enchaînement de substr, qui peut être fait en une seule ligne.
Mais je suis d'accord, ce n'est de toute façon pas plus simple comme méthode, c'est juste moi qui n'ai pas le réflexe regex :)