Si j'ai les valeurs suivantes:
$var1 = AR3,373.31
$var2 = 12.322,11T
Comment créer une nouvelle variable et la définir sur une copie des données dont tous les caractères non numériques ont été supprimés, à l'exception des virgules et des points? Les valeurs ci-dessus renverraient les résultats suivants:
$var1_copy = 3,373.31
$var2_copy = 12.322,11
Vous pouvez utiliser preg_replace pour échanger tous les caractères non numériques, ainsi que la virgule et le point/le point, comme suit:
<?php
$testString = "12.322,11T";
echo preg_replace("/[^0-9,.]/", "", $testString);
?>
Je suis surpris qu'il n'y ait aucune mention de filter_var ici pour une question aussi ancienne ...
PHP a une méthode intégrée pour le faire en utilisant filtres de désinfection . Plus précisément, celui à utiliser dans cette situation est FILTER_SANITIZE_NUMBER_FLOAT
avec les indicateurs FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND
. Ainsi:
$numeric_filtered = filter_var("AR3,373.31", FILTER_SANITIZE_NUMBER_FLOAT,
FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND);
echo $numeric_filtered; // Will print "3,373.31"
Cela vaut également la peine de noter que, parce qu'il est intégré à PHP, il est légèrement plus rapide que d'utiliser regex avec les bibliothèques actuelles de PHP (bien que littéralement en nanosecondes). .
Le moyen le plus simple de réellement supprimer tous les caractères non numériques:
echo preg_replace('/\D/', '', $string);
\D
représente "tout caractère qui n'est pas un chiffre décimal"
Vous pouvez utiliser filter_var
pour supprimer tous les caractères non autorisés, à l'exception des chiffres, des points et de la virgule.
FILTER_SANITIZE_NUMBER_FLOAT
permet de supprimer tous les caractères non numériques de la chaîne.FILTER_FLAG_ALLOW_FRACTION
autorise le séparateur de fractions " . "
FILTER_FLAG_ALLOW_THOUSAND
d'obtenir une virgule à partir de la chaîne.Code
$var1 = '12.322,11T';
echo filter_var($var1, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND);
Sortie
12.322,11
Pour en savoir plus sur filter_var () et Désinfecter les filtres
Si la requête consiste à supprimer tout (et non pas un seul) caractère non numérique, peut-être que le précédent peut être écrit comme ceci d'une manière très simple (mais vous pouvez écrire une fonction pour transmettre la chaîne et lui faire renvoyer la valeur nécessaire sans caractères .. en tous cas..):
<?php
$String1 = 'AR3,373.31';
$String2 = '12.322,11T';
echo preg_replace('/[^0-9,.]+/i', '', $String1);
echo preg_replace('/[^0-9,.]+/i', '', $String2);
?>
Si les lettres sont toujours au début ou à la fin, vous pouvez simplement utiliser trim ... aucune expression rationnelle requise
$string = trim($string, "a..zA..Z"); // this also take care of lowercase
"AR3,373.31" --> "3,373.31"
"12.322,11T" --> "12.322,11"
"12.322,11" --> "12.322,11"