Bug dans modification de chaine de caracteres [Résolu]

Signaler
Messages postés
9
Date d'inscription
mercredi 26 mars 2003
Statut
Membre
Dernière intervention
9 mai 2011
-
Messages postés
9
Date d'inscription
mercredi 26 mars 2003
Statut
Membre
Dernière intervention
9 mai 2011
-
Bonjour a tous,

J'ai un petit probleme avec la fonction substr_replace.
Dans la fonction addSpace que vous pourrez voir ci-dessous, je ne parviens pas à rajouter un espace entre deux ";". Pour etre plus explicite, voici un exemple de chaine de caractere que je traite:

;;98 Crater Drive;Denver;CO;80301

il s'agit d'une adresse stockée dans une vcard, les ";" indiquent un nouveau champ d'adresse (;adresse;complement;ville;Etat;code postal)

je desire stocker chaque champ dans un tableau, je le fais donc avec explode mais le souci est que les champs vides (comme le ;; du debut de la chaine) ne seront pas pris en compte et je décide donc de rajouter un espace (ou un caractère spécial) entre ces deux ";"

function addSpace($str){
//print_r($str);
for ($i=0;$i<count($str); $i++){
//echo'
'.$str[$i].'
';
print_r($str[$i]);
if (($str[$i] == ";")&&($str[$i+1] == ';')){
print_r($str[$i]);
//echo'
'.$str[$i].'
';
$newstr = substr_replace($str,' ',$i);

}

}
return $newstr;
}


Mais cela ne marche pas et seuls les deux premiers caracteres (ici: ;;) de la chaine sont renvoyes.
Mon test conditionnel doit etre faux mais je ne vois pour le moment pas d'autre alternative. :(

Quelqu'un aurait-il une suggestion qui pourrait m'éclairer?

Merci pour vos réponses ^^

6 réponses

Messages postés
128
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
6 mai 2011
2
Bonjour

Je pense que la fonction str_replace est suffisante.
$chaine = ";;98 Crater Drive;Denver;CO;80301 ";
/* remplace tous les double points virgules par des points virgules séparés par un espace */
$chaine = str_replace(";;","; ;",$chaine);
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
12
Salut,

mais le souci est que les champs vides (comme le ;; du debut de la chaine) ne seront pas pris en compte

Et bien justement si.

-> php -r 'var_dump(explode(";", ";;98 Crater Drive;Denver;CO;80301 "));'
array(6) {
  [0]=>
  string(0) ""
  [1]=>
  string(0) ""
  [2]=>
  string(15) "98 Crater Drive"
  [3]=>
  string(6) "Denver"
  [4]=>
  string(2) "CO"
  [5]=>
  string(6) "80301 "
}
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
16
bonjour
pourquoi pas ?
A++

<?php
function addSpace($str){


  $str =explode(";",$str);
  
  echo '';
  print_r($str);
echo '

';
  
  
  foreach ($str as $value){
  echo " ".$value;
  }                    
 
}

$chaine=";;98 Crater Drive;Denver;CO;80301"; 

echo addSpace($chaine);


?>
Messages postés
33
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
7 mars 2013

Bonjour,
Cela n'est t'il pas possible de charger directement ton fichier avec fgetcsv() ?
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
12
Salut,

@LDDL : Le format vCard c'est pas du CSV en soit, j'ai un doute sur le fait que fgetcsv() soit le plus adapté.
Messages postés
9
Date d'inscription
mercredi 26 mars 2003
Statut
Membre
Dernière intervention
9 mai 2011

@Ludwig59: merci pour la réponse, tout fonctionne.
@TychoBrahe: merci aussi a toi, j'aurais du penser au var_dump pour le debug, je vais voir ça de plus près.