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.


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

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

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


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


4
Ini bekerja dengan baik. Ini mengubah +387 (61) 634-783string menjadi 38761634783langsung. Anda tidak harus mengurus array seperti jawaban Gaurav.
beytarovski


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


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


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


9

Menggunakan preg_replace

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

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];
}

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


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


[^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



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");

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 ) 

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)

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


-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;
}

-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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.