web-dev-qa-db-fra.com

Supprimer des caractères non numériques (à l'exception des points et des virgules) d'une chaîne

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
140
user485783

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);
?>
318
John Parker

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

63
Bryan Way

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"

http://php.net/manual/en/regexp.reference.escape.php

26
mopo922

Vous pouvez utiliser filter_var pour supprimer tous les caractères non autorisés, à l'exception des chiffres, des points et de la virgule.

  • Le filtre 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 " . "
  • Le but de 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

3
Adeel

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);
?>
2
andymnc

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"
1
Andrew