Yanıtlar:
$str = 'In My Cart : 11 12 items';
preg_match_all('!\d+!', $str, $matches);
print_r($matches);
$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.
preg_replace("/[^0-9]/","",$string);veyafilter_var($str, FILTER_SANITIZE_NUMBER_INT);
filter_var($str, FILTER_SANITIZE_NUMBER_INT);çıkarılan basamak, artı ve eksi işareti. Çıkarılan normal ifade sadece rakam!
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);
xxx-yyy-24alacaksın --24. Her str_repleace(array('+','-'), '', $result)iki işareti de silmek için kullanabilirsiniz .
max(0,filter_var($str, FILTER_SANITIZE_NUMBER_INT))diziler ve string değiştirmeler kullanarak yapabilirsiniz .
abs((int) filter_var($str, FILTER_SANITIZE_NUMBER_INT));
preg_replace('/[^0-9]/', '', $string);
Bu daha iyi bir iş çıkarmalı! ...
500.00yazdırılacak:50000
extract the numbers from a string- ondalık nokta bir sayı değil!
'çift tırnak değil, tek tırnak kullanmak istiyorsunuz ".
Kullanma preg_replace:
$str = '(111) 111-1111';
$str = preg_replace('/\D/', '', $str);
echo $str;
Çıktı: 1111111111
+387 (61) 634-783dize 38761634783doğrudan. Gaurav'ın cevabı gibi dizilere bakmak zorunda değilsiniz.
+Nicelleştiricinin daha uzun eşleşmelerle / daha az sayıda değiştirmeyle eşleşmesini öneririm .
Değişken sayılar için,
preg_match_all('!\d+\.?\d+!', $string ,$match);
Hatayı belirttiğiniz için teşekkürler. @mickmackusa
'!\d*.?\d+!'
?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.
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)?
Preg_match kullanabilirsiniz :
$s = "In My Cart : 11 items";
preg_match("|\d+|", $s, $m);
var_dump($m);
echo '<p>'.$m[0].'</p>';
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 .
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.
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
bunu deneyin, preg_replace kullanın
$string = "Hello! 123 test this? 456. done? 100%";
$int = intval(preg_replace('/[^0-9]+/', '', $string), 10);
echo $int;
[^0-9]daha basit olarak yazılır \D.
ondan int alabiliriz
$string = 'In My Car_Price : 50660.00';
echo intval(preg_replace('/[^0-9.]/','',$string)); # without number format output: 50660
echo number_format(intval(preg_replace('/[^0-9.]/','',$string))); # with number format output :50,660
demo: http://sandbox.onlinephpfunctions.com/code/82d58b5983e85a0022a99882c7d0de90825aa398
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");
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 )
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)
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.
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;
}
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
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);