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

150

Si j'ai les valeurs suivantes:

 $var1 = AR3,373.31

 $var2 = 12.322,11T

Comment puis-je créer une nouvelle variable et la définir sur une copie des données dont 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
user485783
la source

Réponses:

335

Vous pouvez utiliser preg_replace pour échanger tous les caractères non numériques et la virgule et le point / point comme suit:

<?php
    $testString = '12.322,11T';
    echo preg_replace('/[^0-9,.]/', '', $testString);
?>
John Parker
la source
6
voir aussi php function money_function () ( php.net/manual/en/function.money-format.php )
horatio
5
[^ 0-9] correspondra à n'importe quel caractère non numérique, il n'est donc pas nécessaire d'ajouter la virgule et le point. Cela suffit: echo preg_replace ('/ [^ 0-9] /', '', $ testString);
billrichards
6
@billrichards Je ne pense pas que ce soit correct. N'oubliez pas qu'il souhaite conserver la virgule et le point, ainsi que les caractères numériques, et non les supprimer.
Richt222
1
@billrichards Comme l'a déclaré l'OP (c'est moi qui souligne), "évitez les alphabets ou les caractères sauf la virgule et le point ".
John Parker
cette période n'a-t-elle pas besoin d'une barre oblique inverse? point signifie "n'importe quel caractère" n'est-ce pas?
Scott le
66

Je suis surpris qu'il n'y ait aucune mention de filter_var ici car il s'agit d'une question si ancienne ...

PHP a une méthode intégrée pour faire cela en utilisant filtres de nettoyage . Plus précisément, celui à utiliser dans cette situation est FILTER_SANITIZE_NUMBER_FLOATavec les FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSANDdrapeaux. 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"

Il peut également être intéressant de noter que, comme il est intégré à PHP, il est légèrement plus rapide que l'utilisation de regex avec les bibliothèques actuelles de PHP (bien que littéralement en nanosecondes).

Bryan Way
la source
2
OMI c'est la meilleure réponse.
Ogier Schelvis
30

Le moyen le plus simple de supprimer réellement 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

mopo922
la source
C'est de loin la meilleure réponse :)
baron_bartek
4

Vous pouvez utiliser filter_varpour supprimer tous les caractères illégaux à l'exception des chiffres, des points et de la virgule.

  • Le FILTER_SANITIZE_NUMBER_FLOATfiltre est utilisé pour 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_THOUSANDpour obtenir une virgule 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);

Production

12.322,11

Pour en savoir plus sur les filtres filter_var () et Sanitize

Adeel
la source
2

Si la demande est de supprimer tous les caractères non numériques (et pas seulement un), 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 passer 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);
?>
Andymnc
la source
1

Si les lettres sont toujours au début ou à la fin, vous pouvez simplement utiliser trim ... aucune regex nécessaire

$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"
Andrew
la source
Important: cela supprimera uniquement les lettres de la chaîne. D'autres caractères, tels que des espaces, des crochets, des guillemets, etc. sont conservés à l'intérieur du résultat. -> N'utilisez cette solution que si vous savez que votre chaîne de saisie ne contient que des lettres et des chiffres, et aucun autre caractère!
Philipp le
-1

Même réponse que middaparka mais supprimez le,.

$unformatted_phone = "phone 122-3222223.ext 442";
echo preg_replace("/[^0-9]/", "", $unformatted_phone);
Jonasdev
la source
Veuillez ne pas ajouter les liens vers votre blog / site dans les articles. Cela pourrait être considéré comme du spam.
Tushar
Downvote: Parce que la réponse de middaparka était parfaite. L'OP veut conserver les points et les virgules mais votre réponse les supprime.
Carlos2W