Estrai numeri da una stringa


332

Voglio estrarre i numeri da una stringa che contiene numeri e lettere come:

"In My Cart : 11 items"

Voglio qui per ottenere il numero 11o qualsiasi altro numero.


Usa this $ string = "Nel mio carrello: 11 articoli"; $ number = preg_replace ("/ [^ 0-9] {1,4} /", '', $ stringa); // return 11
Shorabh,

Risposte:


363
$str = 'In My Cart : 11 12 items';
preg_match_all('!\d+!', $str, $matches);
print_r($matches);

2
Come posso ottenere il mio numero in una semplice variabile e non nell'array?
Bizboss

34
$ var = implode ('', $ corrispondenze [0]);
Gaurav,

2
@Bizboss In modo simile, prova $newstr = preg_replace('!\d+!', '', $str);. Eliminerà tutte le cifre dalla stringa. Esempio: $str = 'In My Cart : 11 12 items';verrà emesso In My Cart : items.
Etere

77
questo non è un modo amichevole delle risorse. usa preg_replace("/[^0-9]/","",$string);ofilter_var($str, FILTER_SANITIZE_NUMBER_INT);
eapo il

6
Cifre filter_var($str, FILTER_SANITIZE_NUMBER_INT);estratte da @eapo , segno più e meno . Il regex ha estratto solo cifre!
PATROMO

537

Se vuoi semplicemente filtrare tutto tranne i numeri, il più semplice è usare filter_var :

$str = 'In My Cart : 11 items';
$int = (int) filter_var($str, FILTER_SANITIZE_NUMBER_INT);

56
Un trattino prima di un numero verrà trattato come meno.
Elnur Abdurrakhimov,

43
Non solo prima del numero. Qualsiasi +/- non verrà troncato. Se hai xxx-yyy-24, otterrai --24. È possibile utilizzare str_repleace(array('+','-'), '', $result)per eliminare entrambi i segni.
imclickingmaniac

4
@imclickingmaniac puoi semplicemente fare max(0,filter_var($str, FILTER_SANITIZE_NUMBER_INT))invece usando array e sostituzioni di stringhe.
Eduard,

2
l'utilizzo di max () restituisce anche il segno meno nelle stringhe, la speranza strreplace () è l'opzione qui. Grazie per i suggerimenti.
Shiva Avula,

26
abs((int) filter_var($str, FILTER_SANITIZE_NUMBER_INT));
MECU,

300
preg_replace('/[^0-9]/', '', $string);

Questo dovrebbe fare un lavoro migliore! ...


10
Mi piace perché restituisce una stringa, non una matrice come fanno gli esempi con preg_match_all, e mi piace perché voglio solo numeri, non un segno più o un trattino, come nell'esempio filter_var.
Darrell Duane,

43
Rispettoso di questo metodo: qualcosa come 'In My Car_Price: 500.00stamperà:50000
ErickBest

16
@ErickBest Questa è una buona cosa, considerando la domanda era extract the numbers from a string: un punto decimale non è un numero!
rybo111,

1
Questo è un nitpick ma probabilmente vuoi usare virgolette singole 'e non doppie ".
CommandZ

16
preg_replace ( '/ [^ 0-9.] /', '', 'abc1.22'); // restituisce il decimale 1,22
zzapper il

84

Utilizzando preg_replace:

$str = '(111) 111-1111';
$str = preg_replace('/\D/', '', $str);
echo $str;

Uscita: 1111111111


4
Funziona benissimo. Converte direttamente la +387 (61) 634-783stringa 38761634783. Non devi occuparti di array come la risposta di Gaurav.
beytarovski,

1
Sicuramente la risposta migliore. sandbox.onlinephpfunctions.com/code/…
Steffan,

Consiglio al +quantificatore di abbinare partite più lunghe / meno sostituzioni.
Mickmackusa,

21

Per numeri fluttuanti,

preg_match_all('!\d+\.?\d+!', $string ,$match);

Grazie per aver segnalato l'errore. @mickmackusa


In realtà è sbagliato :) Dovrebbe essere'!\d*.?\d+!'
Yash

Preferirei usare ?come quantificatore del punto letterale. Non mi aspetterei che un valore float contenga più simboli decimali. Lo schema commentato di Yash è ironicamente sbagliato . Il punto ha bisogno di una barra davanti per renderlo letterale.
Mickmackusa,

11

Non possiedo il credito per questo, ma devo solo condividerlo. Questa regex otterrà numeri da una stringa, inclusi punti / posizioni decimali, nonché virgole:

/((?:[0-9]+,)*[0-9]+(?:\.[0-9]+)?)/

Citato da qui:
php - regex - come estrarre un numero con decimale (punto e virgola) da una stringa (ad es. 1.120.01)?


Questo non sta convalidando la stringa per una virgola tra gruppi di tre numeri interi. ... il problema di copiare e incollare lo schema di qualcun altro e non capirlo / testarlo.
Mickmackusa,


9

Usando preg_replace

$str = 'In My Cart : 11 12 items';
$str = preg_replace('/\D/', '', $str);
echo $str;

Consiglio al +quantificatore di abbinare partite più lunghe / meno sostituzioni.
Mickmackusa,

6

È possibile utilizzare la seguente funzione:

function extract_numbers($string)
{
   preg_match_all('/([\d]+)/', $string, $match);

   return $match[0];
}

Non è utile scrivere \dall'interno di una classe di caratteri. Dal momento che stai accedendo alla corrispondenza fullstring, non ha senso scrivere un gruppo di acquisizione nel modello.
Mickmackusa,

4
preg_match_all('!\d+!', $some_string, $matches);
$string_of_numbers = implode(' ', $matches[0]);

Il primo argomento in implode in questo caso specifico dice "separa ogni elemento nelle corrispondenze [0] con un singolo spazio". Implode non inserirà uno spazio (o qualunque sia il tuo primo argomento) prima del primo numero o dopo l'ultimo numero.

Qualcos'altro da notare è $ corrispondenze [0] è dove è memorizzata la matrice di corrispondenze (che corrispondono a questa espressione regolare).

Per ulteriori chiarimenti su cosa servono gli altri indici dell'array: http://php.net/manual/en/function.preg-match-all.php


4

prova questo, usa preg_replace

$string = "Hello! 123 test this? 456. done? 100%";
$int = intval(preg_replace('/[^0-9]+/', '', $string), 10);
echo $int;

DEMO


[^0-9]è più semplicemente scritto come \D.
Mickmackusa,

3
$value = '25%';

O

$value = '25.025$';

O

$value = 'I am numeric 25';
$onlyNumeric = filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

Questo restituirà solo il valore numerico



3

Seguire questo passaggio convertirà la stringa in numero

$value = '$0025.123';
$onlyNumeric = filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
settype($onlyNumeric,"float");

$result=($onlyNumeric+100);
echo $result;

Un altro modo per farlo:

$res = preg_replace("/[^0-9.]/", "", "$15645623.095605659");

0

altro modo (stringa unicode pari):

$res = array();
$str = 'test 1234 555 2.7 string ..... 2.2 3.3';
$str = preg_replace("/[^0-9\.]/", " ", $str);
$str = trim(preg_replace('/\s+/u', ' ', $str));
$arr = explode(' ', $str);
for ($i = 0; $i < count($arr); $i++) {
    if (is_numeric($arr[$i])) {
        $res[] = $arr[$i];
    }
}
print_r($res); //Array ( [0] => 1234 [1] => 555 [2] => 2.7 [3] => 2.2 [4] => 3.3 ) 

0

Questo script crea inizialmente un file, scrive i numeri su una riga e passa alla riga successiva se ottiene un carattere diverso dal numero. Alla fine, di nuovo ordina i numeri in un elenco.

string1 = "hello my name 12 is after 198765436281094and14 and 124de"
f= open("created_file.txt","w+")
for a in string1:
    if a in ['1','2','3','4','5','6','7','8','9','0']:
        f.write(a)
    else:
        f.write("\n" +a+ "\n")
f.close()


#desired_numbers=[x for x in open("created_file.txt")]

#print(desired_numbers)

k=open("created_file.txt","r")
desired_numbers=[]
for x in k:
    l=x.rstrip()
    print(len(l))
    if len(l)==15:
        desired_numbers.append(l)


#desired_numbers=[x for x in k if len(x)==16]
print(desired_numbers)

-1

A seconda del caso d'uso, questa potrebbe anche essere un'opzione:

$str = 'In My Cart : 11 items';
$num = '';

for ($i = 0; $i < strlen($str); $i++) {

    if (is_numeric($str[$i])) {
        $num .= $str[$i];
    }
}

echo $num; // 11

Anche se sarei d'accordo su una regex o filter_var()sarebbe più utile nel caso dichiarato.


-1

per utf8 str:

function unicodeStrDigits($str) {
    $arr = array();
    $sub = '';
    for ($i = 0; $i < strlen($str); $i++) { 
        if (is_numeric($str[$i])) {
            $sub .= $str[$i];
            continue;
        } else {
            if ($sub) {
                array_push($arr, $sub);
                $sub = '';
            }
        }
    }

    if ($sub) {
        array_push($arr, $sub); 
    }

    return $arr;
}

-1

Se non sai quale formato è il numero? int o floating, quindi usa questo:

$string = '$125.22';

$string2 = '$125';

preg_match_all('/(\d+.?\d+)/',$string,$matches); // $matches[1] = 125.22

preg_match_all('/(\d+.?\d+)/',$string2,$matches); // $matches[1] = 125

-1

Questa funzione gestirà anche i numeri fluttuanti

$str = "Doughnuts, 4; doughnuts holes, 0.08; glue, 3.4";
$str = preg_replace('/[^0-9\.]/','-', $str);
$str = preg_replace('/(\-+)(\.\.+)/','-', $str);
$str = trim($str, '-');
$arr = explode('-', $str);

L'introduzione di trattini in questo processo è del tutto superflua. Questa risposta manca anche di una spiegazione di come funziona e perché ritieni che sia una buona idea.
Mickmackusa,
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.