Rimuovi caratteri non numerici (tranne punti e virgole) da una stringa


150

Se ho i seguenti valori:

 $var1 = AR3,373.31

 $var2 = 12.322,11T

Come posso creare una nuova variabile e impostarla su una copia dei dati a cui sono stati rimossi caratteri non numerici, ad eccezione di virgole e punti? I valori sopra riportati restituirebbero i seguenti risultati:

 $var1_copy = 3,373.31

 $var2_copy = 12.322,11

Risposte:


335

È possibile utilizzare preg_replace per scambiare tutti i caratteri non numerici e la virgola e il punto / punto e virgola come segue:

<?php
    $testString = '12.322,11T';
    echo preg_replace('/[^0-9,.]/', '', $testString);
?>

6
vedi anche la funzione php money_function () ( php.net/manual/en/function.money-format.php )
horatio

5
[^ 0-9] corrisponderà a qualsiasi carattere non numerico, quindi non è necessario aggiungere la virgola e il punto. Questo è sufficiente: echo preg_replace ('/ [^ 0-9] /', '', $ testString);
billrichards,

6
@billrichards Non penso sia corretto. Ricorda che vuole conservare la virgola e il punto, insieme ai caratteri numerici, non rimuoverli.
Richt222,

1
@billrichards Come affermato dall'OP (sottolineatura mia), "evitare alfabeti o caratteri tranne virgola e punto ".
John Parker,

quel periodo non ha bisogno di una barra rovesciata? punto significa "qualsiasi personaggio", no?
Scott,

66

Sono sorpreso che non ci sia stata alcuna menzione di filter_var qui perché questa è una domanda così vecchia ...

PHP ha un metodo integrato per farlo usando i filtri di sanificazione . In particolare, quello da utilizzare in questa situazione è FILTER_SANITIZE_NUMBER_FLOATcon le FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSANDbandiere. Così:

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

Potrebbe anche essere utile notare che, poiché è integrato in PHP, è leggermente più veloce rispetto all'uso di regex con le librerie attuali di PHP (anche se letteralmente in nanosecondi).


2
IMO questa è la risposta migliore.
Ogier Schelvis,


4

È possibile utilizzare filter_varper rimuovere tutti i caratteri non consentiti tranne cifre, punto e virgola.

  • Il FILTER_SANITIZE_NUMBER_FLOATfiltro viene utilizzato per rimuovere tutti i caratteri non numerici dalla stringa.
  • FILTER_FLAG_ALLOW_FRACTION sta permettendo il separatore di frazioni " . "
  • Lo scopo di FILTER_FLAG_ALLOW_THOUSANDottenere la virgola dalla stringa.

Codice

$var1 = '12.322,11T';

echo filter_var($var1, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND);

Produzione

12.322,11

Per saperne di più sui filtri filter_var () e Sanitize


2

Se la richiesta è di rimuovere tutti (e non solo) un carattere non numerico, forse il precedente può essere scritto in questo modo in un modo molto semplice (ma potresti scrivere una funzione per passare la stringa e farla restituire il valore necessario senza caratteri .. Comunque..):

<?php
$String1 = 'AR3,373.31';
$String2 = '12.322,11T';

echo preg_replace('/[^0-9,.]+/i', '', $String1);
echo preg_replace('/[^0-9,.]+/i', '', $String2);
?>

1

Se le lettere sono sempre all'inizio o alla fine, puoi semplicemente usare il trim ... non è necessaria la regex

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

Importante: questo rimuoverà solo le lettere dalla stringa. Altri caratteri, come spazi, parentesi, virgolette, ecc. Vengono mantenuti all'interno del risultato. -> Usa questa soluzione solo se sai che la tua stringa di input contiene solo lettere e numeri e nessun altro carattere!
Philipp,

-1

Stessa risposta di middaparka ma rimuovi il file,.

$unformatted_phone = "phone 122-3222223.ext 442";
echo preg_replace("/[^0-9]/", "", $unformatted_phone);

Si prega di non aggiungere i collegamenti al tuo blog / sito nei post. Potrebbe essere considerato spam.
Tushar,

Downvote: Perché la risposta di middaparka è stata perfetta. L'OP vuole mantenere punti e virgole ma la tua risposta li rimuove.
Carlos2W,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.