découpage d'une chaine de caractères

VaN
Mammouth du PHP | 1107 Messages

10 mai 2007, 17:13

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 ?

Eléphant du PHP | 451 Messages

10 mai 2007, 18:05

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];
Jpaul
J'essaye d'aider : parfois je fais des erreurs, on me les corrige et j'apprends un peu plus. Super ce forum :)

lem
Eléphant du PHP | 108 Messages

10 mai 2007, 18:11

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
Lem.

Eléphant du PHP | 451 Messages

10 mai 2007, 22:41

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: .
Jpaul
J'essaye d'aider : parfois je fais des erreurs, on me les corrige et j'apprends un peu plus. Super ce forum :)

lem
Eléphant du PHP | 108 Messages

11 mai 2007, 14:11

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 :)
Lem.