Ekstrak angka dari string

332

Saya ingin mengekstrak angka dari string yang berisi angka dan huruf seperti:

"In My Cart : 11 items"

Saya ingin mendapatkan nomor ini 11atau nomor lainnya di sini.

Bizboss
sumber
Gunakan $ string = "Dalam Keranjang Saya: 11 item"; $ number = preg_replace ("/ [^ 0-9] {1,4} /", '', $ string); // kembalikan 11
Shorabh

Jawaban:

363
$str = 'In My Cart : 11 12 items';
preg_match_all('!\d+!', $str, $matches);
print_r($matches);
Gaurav
sumber
2
Bagaimana saya bisa mendapatkan nomor saya dalam variabel sederhana dan tidak di Array?
Bizboss
34
$ var = implode ('', $ cocok [0]);
Gaurav
2
@Bizboss Dengan nada yang sama, coba $newstr = preg_replace('!\d+!', '', $str);. Ini akan menghapus semua digit dari string Anda. Contoh: $str = 'In My Cart : 11 12 items';akan ditampilkan In My Cart : items.
Aether
77
ini bukan cara yang ramah sumber daya. gunakan preg_replace("/[^0-9]/","",$string);ataufilter_var($str, FILTER_SANITIZE_NUMBER_INT);
eapo
6
@eapo filter_var($str, FILTER_SANITIZE_NUMBER_INT);mengekstraksi angka, tanda tambah dan minus . Regex hanya mengekstraksi digit!
PATROMO
537

Jika Anda hanya ingin memfilter segala sesuatu selain nomor yang keluar, cara termudah adalah menggunakan filter_var :

$str = 'In My Cart : 11 items';
$int = (int) filter_var($str, FILTER_SANITIZE_NUMBER_INT);
Daniel Bøndergaard
sumber
56
Tanda hubung sebelum angka akan dianggap sebagai minus.
Elnur Abdurrakhimov
43
Tidak hanya sebelum nomor. +/- tidak akan terpotong. Jika sudah, xxx-yyy-24Anda akan mendapatkannya --24. Anda dapat menggunakan str_repleace(array('+','-'), '', $result)untuk menghapus kedua tanda.
imclickingmaniac
4
@imclickingmaniac, Anda cukup melakukannya max(0,filter_var($str, FILTER_SANITIZE_NUMBER_INT))dengan menggunakan array dan penggantian string.
Eduard
2
menggunakan max () juga mengembalikan tanda minus pada string, harap strreplace () adalah opsi di sini. Terima kasih atas tipsnya.
Shiva Avula
26
abs((int) filter_var($str, FILTER_SANITIZE_NUMBER_INT));
MECU
300
preg_replace('/[^0-9]/', '', $string);

Ini harus melakukan pekerjaan yang lebih baik! ...

Mahipalsinh Ravalji
sumber
10
Saya suka ini karena mengembalikan string, bukan array seperti contoh dengan preg_match_all lakukan, dan saya suka karena saya hanya ingin angka, bukan tanda tambah atau tanda hubung, seperti contoh filter_var lakukan.
Darrell Duane
43
500.0050000
Berhati
16
@ ErickBest Itu hal yang baik, mengingat pertanyaannya adalah extract the numbers from a string- titik desimal bukan angka!
rybo111
1
Ini adalah nitpick tetapi Anda mungkin ingin menggunakan tanda kutip tunggal 'dan bukan tanda kutip ganda ".
CommandZ
16
preg_replace ('/ [^ 0-9.] /', '', 'abc1.22'); // mengembalikan desimal 1.22
zzapper
84

Menggunakan preg_replace:

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

Output: 1111111111

Akash Deep
sumber
4
Ini bekerja dengan baik. Ini mengubah +387 (61) 634-783string menjadi 38761634783langsung. Anda tidak harus mengurus array seperti jawaban Gaurav.
beytarovski
1
Jelas jawaban terbaik. sandbox.onlinephpfunctions.com/code/…
Steffan
Saya merekomendasikan +quantifier untuk mencocokkan kecocokan lebih lama / penggantian lebih sedikit.
mickmackusa
21

Untuk angka mengambang,

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

Terima kasih telah menunjukkan kesalahannya. @mickmackusa

Yash
sumber
Ini sebenarnya salah :) Seharusnya'!\d*.?\d+!'
Yash
Saya lebih suka menggunakan ?sebagai quantifier dari titik literal. Saya tidak akan mengharapkan nilai float mengandung beberapa simbol titik desimal. Pola berkomentar Yash salah ironis. Titik membutuhkan garis miring di depannya untuk membuatnya harfiah.
mickmackusa
11

Saya tidak memiliki kredit untuk ini, tetapi saya hanya harus membagikannya. Regex ini akan mendapatkan angka dari string, termasuk titik / tempat desimal, serta koma:

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

Dikutip dari sini:
php - regex - bagaimana cara mengekstrak angka dengan desimal (titik dan koma) dari sebuah string (misalnya, 1.120,01)?

mroncetwice
sumber
Ini tidak memvalidasi string untuk koma antara set tiga bilangan bulat. ... masalah dengan copy-paste pola orang lain dan tidak memahami / mengujinya.
mickmackusa
9

Anda dapat menggunakan preg_match :

$s = "In My Cart : 11 items";
preg_match("|\d+|", $s, $m);
var_dump($m);
Dmitri Gudkov
sumber
echo '<p>'.$m[0].'</p>';
Pathros
9

Menggunakan preg_replace

$str = 'In My Cart : 11 12 items';
$str = preg_replace('/\D/', '', $str);
echo $str;
Hariadi
sumber
Saya merekomendasikan +quantifier untuk mencocokkan kecocokan lebih lama / penggantian lebih sedikit.
mickmackusa
6

Anda dapat menggunakan fungsi berikut:

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

   return $match[0];
}
Jasmeen
sumber
Tidak ada manfaatnya menulis \ddi dalam kelas karakter. Karena Anda mengakses pertandingan fullstring, tidak ada gunanya menulis grup tangkap ke dalam pola.
mickmackusa
4
preg_match_all('!\d+!', $some_string, $matches);
$string_of_numbers = implode(' ', $matches[0]);

Argumen pertama dalam implode dalam kasus khusus ini mengatakan "pisahkan setiap elemen dalam pertandingan [0] dengan satu spasi." Implode tidak akan memberi spasi (atau apa pun argumen pertama Anda) sebelum angka pertama atau setelah angka terakhir.

Hal lain yang perlu diperhatikan adalah $ cocok [0] adalah tempat array cocok (yang cocok dengan persamaan reguler ini) ditemukan disimpan.

Untuk klarifikasi lebih lanjut tentang apa indeks lain dalam array untuk lihat: http://php.net/manual/en/function.preg-match-all.php

Bradley Kovacs
sumber
4

coba ini, gunakan preg_replace

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

DEMO

Dave
sumber
[^0-9]lebih sederhana ditulis sebagai \D.
mickmackusa
3
$value = '25%';

Atau

$value = '25.025$';

Atau

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

Ini hanya akan mengembalikan nilai numerik

Rakesh
sumber
3

Ikuti langkah ini untuk mengubah string menjadi angka

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

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

Cara lain untuk melakukannya:

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

cara lain (bahkan unicode string):

$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 ) 
Mehrdad
sumber
0

Skrip ini membuat file pada awalnya, menulis angka ke baris dan mengubah ke baris berikutnya jika mendapat karakter selain angka. Akhirnya, sekali lagi memilah angka-angka ke daftar.

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)
Abhishek Poudel
sumber
-1

Tergantung pada kasus penggunaan Anda, ini juga bisa menjadi pilihan:

$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

Meskipun saya akan menyetujui regex atau filter_var()akan lebih berguna dalam kasus yang disebutkan.

kasimir
sumber
-1

untuk 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;
}
Mehrdad
sumber
-1

Jika Anda tidak tahu format mana nomornya? int atau mengambang, lalu gunakan ini:

$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
Sajjad Hossain Sagor
sumber
-1

Fungsi ini juga akan menangani angka mengambang

$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);
Khaldoon Masud
sumber
Memperkenalkan tanda hubung untuk proses ini sama sekali tidak perlu. Jawaban ini juga tidak memiliki penjelasan tentang cara kerjanya dan mengapa Anda merasa itu adalah ide yang bagus.
mickmackusa