Discussion:
Supprimer des espaces dans une chaine
(trop ancien pour répondre)
jef80
2010-04-29 21:29:15 UTC
Permalink
Bonjour,
Pb avec cette petite routine (j'ai laissé les commentaires pour mieux de
compréhension).

ALGO: Lecture d'un caractère,
si ce caractère est un espace et si le caractère précédent est un chiffre
et si le 3ème caractère précédent n'est pas une virgule,
alors supprimer ce caractère.
Retourner la chaîne corrigée

Je dois obtenir la même chaine avec suppression des espaces des mille:
$ligne2 = "abc 6221,26 1343,25 F";

<?php
$ligne = "abc 6 221,26 1 343,25 F";
$ligne2 = "";
$nb_car = strlen($ligne);
echo "<B>AVANT: </B><BR> $ligne<BR>";
echo "Nbe de caractères de la ligne AVANT: ", $nb_car, "<BR>";
echo "\$ligne (dans boucle for)= <BR>";
for ($i=0; $i <= ($nb_car-1); $i++) {
$car = $ligne[$i]; //parcours la ligne pas à pas
echo $car; //réaffiche pas à pas la ligne d'origine
//le test n'est nécessaire qu'à partir du 4ème car de la ligne
if ($i > 3) { //pour pouvoir tester le car $i-3
//si le car lu courant est un espace
// et le car précédent est un chiffre
// et si le 3e car précédent n'est pas une virgule
if (($car = " ") && (is_numeric($ligne[$i-1])) && ($ligne[$i-3] != ","))
{
//$ligne2 .= chr(0); //alors on n'ajoute rien à $ligne2
} else {
//on garde le car lu courant
$ligne2 .= $car;
}
} else {
//$i<=3 : on garde le car lu courant
$ligne2 .= $car;
}
}
$nb_car2 = strlen($ligne2);
echo "<BR>Nbe de caractères APRES: ", $nb_car2, "<BR>";
echo "APRES= <BR>$ligne2";
?>

Si vous avez un peu de temps ?
Cordialement jf.
Olivier Miakinen
2010-04-29 22:04:56 UTC
Permalink
Post by jef80
Bonjour,
Pb avec cette petite routine (j'ai laissé les commentaires pour mieux de
compréhension).
ALGO: Lecture d'un caractère,
si ce caractère est un espace et si le caractère précédent est un chiffre
et si le 3ème caractère précédent n'est pas une virgule,
alors supprimer ce caractère.
Retourner la chaîne corrigée
$ligne2 = preg_replace('/(?<=\d)(?<!,..) /', '', $ligne);

Explication :
'(?<=\d)' = assertion qu'il y a un chiffre avant
'(?<!,..)' = assertion que le premier des trois caractères précédents
n'est pas une virgule
' ' = espace
'' = remplacer (l'espace) par rien.

Note que cette expression, directement traduite de ta demande, a un
petit défaut dans le cas où le nombre suit un mot avec virgule est
commence par un seul chiffre :

"Ah, 3 000,00 F !" (l'espace après le 3 ne sera pas supprimée)

En revanche, la regexp suivante fonctionne mieux dans ce cas :

$ligne2 = preg_replace('/(?<=\d)(?<!,\d.) /', '', $ligne);

En effet, sachant qu'il faut un chiffre avant l'espace, on refuse que ce
chiffre soit précédé d'une virgule *et d'un autre chiffre*.
Post by jef80
$ligne2 = "abc 6221,26 1343,25 F";
<?php
$ligne = "abc 6 221,26 1 343,25 F";
Ok, ça marche.
Post by jef80
Si vous avez un peu de temps ?
Si tu as un peu de temps toi-même : <http://fr.php.net/pcre>.

Cordialement,
--
Olivier Miakinen
Olivier Miakinen
2010-05-03 07:07:44 UTC
Permalink
Bonjour,

Le 01/05/2010 23:49, jef80 m'a répondu en privé :
Petite erreur d'aiguillage, j'ai reçu ta réponse dans ma bàl et pas dans
le groupe.
Post by Olivier Miakinen
Si tu as un peu de temps toi-même : <http://fr.php.net/pcre>.
Merci Olivier,
Mais il me faut comprendre la logique des Expressions rationnelles pour
employer les fonctions PCRE (preg_xxx). Le sujet a l'air d'être assez
étendu.
En ce qui concerne les expressions rationnelles, en effet le sujet est
étendu mais ça vaut le coup de s'y mettre : il n'y a qu'à voir comment
j'ai remplacé ton script d'une vingtaine de lignes (trente avec les
traces) par un seul appel de fonction.

Pour info, je te signale l'existence d'un groupe de discussions consacré
exclusivement aux regexp : <news:fr.comp.lang.regexp>.

Cordialement,
--
Olivier Miakinen
jef80
2010-05-03 16:54:32 UTC
Permalink
Post by jef80
Bonjour,
Petite erreur d'aiguillage, j'ai reçu ta réponse dans ma bàl et pas dans
le groupe.
Post by Olivier Miakinen
Si tu as un peu de temps toi-même : <http://fr.php.net/pcre>.
Merci Olivier,
Mais il me faut comprendre la logique des Expressions rationnelles pour
employer les fonctions PCRE (preg_xxx). Le sujet a l'air d'être assez
étendu.
En ce qui concerne les expressions rationnelles, en effet le sujet est
étendu mais ça vaut le coup de s'y mettre : il n'y a qu'à voir comment
j'ai remplacé ton script d'une vingtaine de lignes (trente avec les
traces) par un seul appel de fonction.
Pour info, je te signale l'existence d'un groupe de discussions consacré
exclusivement aux regexp : <news:fr.comp.lang.regexp>.
Cordialement,
--
Olivier Miakinen
Pour l'instant j'ai réalisé (rapidement) ce programme sous mon vieux Delphi;
en attendu de maîtriser la logique des expressions rationnelles sous PHP.
Merci pour l'indication du serveur de news sur le sujet.
Cordialement
jf .

Continuer la lecture sur narkive:
Loading...