Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Supprimer des espaces dans une chaine

3 réponses
Avatar
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

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.

3 réponses

Avatar
Olivier Miakinen
Le 29/04/2010 23:29, jef80 a écrit :
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*.


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";



Ok, ça marche.

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
Avatar
Olivier Miakinen
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.

> 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
Avatar
jef80
"Olivier Miakinen" <om+ a écrit dans le message de news:
4bde7385$
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.

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