Bir dizeden sayıları ayıkla


332

Sayılar ve harfler gibi bir dizeden sayıları ayıklamak istiyorum:

"In My Cart : 11 items"

Burada numarayı 11veya başka bir numarayı almak istiyorum .


Bu $ string = "Sepetim: 11 öğe" kullanın; $ number = preg_replace ("/ [^ 0-9] {1,4} /", '', $ string); // dönüş 11
Shorabh

Yanıtlar:


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

2
Numaramı Array'da değil, basit bir değişkende nasıl alabilirim?
Bizboss

34
$ var = implode ('', $, [0] ile eşleşir);
Gaurav

2
@Bizboss Benzer bir şekilde deneyin $newstr = preg_replace('!\d+!', '', $str);. Dizenizdeki tüm basamakları çıkarır. Örnek: $str = 'In My Cart : 11 12 items';çıktı verecektir In My Cart : items.
Aether

77
Bu kaynak dostu bir yol değildir. kullanın preg_replace("/[^0-9]/","",$string);veyafilter_var($str, FILTER_SANITIZE_NUMBER_INT);
eapo

6
@eapo filter_var($str, FILTER_SANITIZE_NUMBER_INT);çıkarılan basamak, artı ve eksi işareti. Çıkarılan normal ifade sadece rakam!
PATROMO

536

Sadece sayılar dışındaki her şeyi filtrelemek istiyorsanız, en kolayı filter_var kullanmaktır :

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

56
Bir sayıdan önceki kısa çizgi eksi olarak değerlendirilir.
Elnur Abdurrakhimov

43
Sadece sayıdan önce değil. Hiçbir +/- kesilmez. Eğer varsa xxx-yyy-24alacaksın --24. Her str_repleace(array('+','-'), '', $result)iki işareti de silmek için kullanabilirsiniz .
imclickingmaniac

4
@imclickingmaniac basitçe max(0,filter_var($str, FILTER_SANITIZE_NUMBER_INT))diziler ve string değiştirmeler kullanarak yapabilirsiniz .
Eduard

2
max () kullanmak da dizelerde eksi işareti döndürüyor, umut strreplace () burada seçenek. İpuçları için teşekkürler.
Shiva Avula

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

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

Bu daha iyi bir iş çıkarmalı! ...


10
Ben preg_match_all yapmak örnekleri gibi bir dizi değil, bir dize döndürdüğü için bunu seviyorum ve filter_var örneğinin yaptığı gibi sadece bir artı işareti veya tire değil, sayılar istiyorum çünkü seviyorum.
Darrell Duane

43
Bu yöntemle dikkatli olun: 'In My Car_Price gibi bir şey 500.00yazdırılacak:50000
ErickBest

16
@ErickBest Bu iyi bir şey, soru şuydu extract the numbers from a string- ondalık nokta bir sayı değil!
rybo111

1
Bu bir nitpick ama muhtemelen 'çift ​​tırnak değil, tek tırnak kullanmak istiyorsunuz ".
CommandZ

16
preg_replace ( '/ [^ 0-9.] /', '', 'abc1.22'); // ondalık 1.22
değerini

84

Kullanma preg_replace:

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

Çıktı: 1111111111


4
Harika çalışıyor. Bu dönüştürür +387 (61) 634-783dize 38761634783doğrudan. Gaurav'ın cevabı gibi dizilere bakmak zorunda değilsiniz.
beytarovski

1

+Nicelleştiricinin daha uzun eşleşmelerle / daha az sayıda değiştirmeyle eşleşmesini öneririm .
mickmackusa

21

Değişken sayılar için,

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

Hatayı belirttiğiniz için teşekkürler. @mickmackusa


Aslında yanlış :) '!\d*.?\d+!'
Yash

?Değişmez noktanın nicelleştiricisi olarak kullanmayı tercih ederim . Bir kayan nokta değerinin birden çok ondalık sayı simgesi içermesini beklemezdim. Yash'ın yorumladığı örüntü ironik bir şekilde yanlış . Nokta, kelimenin tam anlamıyla yapmak için önünde bir eğik çizgiye ihtiyaç duyar.
mickmackusa

11

Bunun için krediye sahip değilim, ama sadece paylaşmak zorundayım. Bu normal ifade, virgüllerin yanı sıra ondalık basamaklar / yerler dahil bir dizeden sayılar alır:

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

Burada alıntı:
php - regex - bir dizeden ondalık (nokta ve virgül) ile bir sayı çıkarmak nasıl (örneğin, 1.120.01)?


Bu, üç tam sayı kümesi arasındaki virgül için dizeyi doğrulamaz. ... başkasının desenini kopyalayıp yapıştırma ve anlama / test etmeme sorunu.
mickmackusa


9

Preg_replace kullanma

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

+Nicelleştiricinin daha uzun eşleşmelerle / daha az sayıda değiştirmeyle eşleşmesini öneririm .
mickmackusa

6

Aşağıdaki işlevi kullanabilirsiniz:

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

   return $match[0];
}

\dBir karakter sınıfının içine yazmanın bir yararı yoktur . Tam dizeli eşleşmeye eriştiğiniz için, desene bir yakalama grubu yazmanın bir anlamı yoktur.
mickmackusa

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

Bu özel durumda implode edilen ilk argüman "[0] eşleşmelerindeki her bir öğeyi tek bir boşlukla ayır" diyor. Implode, ilk sayıdan önce veya son sayıdan sonra boşluk bırakmaz (ya da ilk argümanınız ne olursa olsun).

Dikkat edilmesi gereken başka bir şey ise $ match [0] bulunan eşleşme dizisinin (bu normal ifadeyle eşleşen) bulunduğu yerdir.

Dizideki diğer dizinlerin ne olduğu hakkında daha fazla açıklama için bkz. Http://php.net/manual/en/function.preg-match-all.php


4

bunu deneyin, preg_replace kullanın

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

DEMO


[^0-9]daha basit olarak yazılır \D.
mickmackusa

3
$value = '25%';

Veya

$value = '25.025$';

Veya

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

Bu yalnızca sayısal değer döndürür



3

Dizeyi sayıya dönüştürecek bu adımı izleyin

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

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

Bunu yapmanın başka bir yolu:

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

0

başka bir şekilde (hatta unicode dize):

$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

Bu komut dosyası önce bir dosya oluşturur, bir satıra rakamlar yazar ve sayı dışında bir karakter alırsa bir sonraki satıra geçer. Sonunda, yine sayıları bir listeye ayırır.

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

Kullanım durumunuza bağlı olarak, bu bir seçenek olabilir:

$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

Gerçi bir normal ifadeye katılıyorum ya filter_var()da belirtilen davada daha yararlı olacaktır.


-1

utf8 str için:

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

Sayının hangi formatta olduğunu bilmiyorsanız? int veya yüzer, bunu kullanın:

$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

Bu işlev kayan sayıları da işleyecektir

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

Bu işleme tireler sokmak tamamen gereksizdir. Bu cevap aynı zamanda nasıl çalıştığına ve neden iyi bir fikir olduğunu düşündüğünüze dair bir açıklama da içermiyor.
mickmackusa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.