Extrahieren Sie Zahlen aus einer Zeichenfolge

332

Ich möchte die Zahlen aus einer Zeichenfolge extrahieren, die Zahlen und Buchstaben enthält wie:

"In My Cart : 11 items"

Ich möchte hier die Nummer 11oder eine andere Nummer bekommen.

Bizboss
quelle
Verwenden Sie diese $ string = "In meinem Warenkorb: 11 Artikel"; $ number = preg_replace ("/ [^ 0-9] {1,4} /", '', $ string); // Rückkehr 11
Shorabh

Antworten:

363
$str = 'In My Cart : 11 12 items';
preg_match_all('!\d+!', $str, $matches);
print_r($matches);
Gaurav
quelle
2
Wie kann ich meine Nummer in einer einfachen Variablen und nicht in Array erhalten?
Bizboss
34
$ var = implode ('', $ entspricht [0]);
Gaurav
2
@Bizboss In ähnlicher Weise versuchen Sie es $newstr = preg_replace('!\d+!', '', $str);. Es werden alle Ziffern aus Ihrer Zeichenfolge entfernt. Beispiel: $str = 'In My Cart : 11 12 items';wird ausgegeben In My Cart : items.
Äther
77
Dies ist kein ressourcenschonender Weg. benutze preg_replace("/[^0-9]/","",$string);oderfilter_var($str, FILTER_SANITIZE_NUMBER_INT);
eapo
6
@eapo filter_var($str, FILTER_SANITIZE_NUMBER_INT);extrahierte Ziffern, Plus- und Minuszeichen . Der Regex extrahierte nur Ziffern!
PATROMO
535

Wenn Sie nur alles andere als die Zahlen herausfiltern möchten, verwenden Sie am einfachsten filter_var :

$str = 'In My Cart : 11 items';
$int = (int) filter_var($str, FILTER_SANITIZE_NUMBER_INT);
Daniel Bøndergaard
quelle
56
Ein Bindestrich vor einer Zahl wird als Minus behandelt.
Elnur Abdurrakhimov
43
Nicht nur vor der Nummer. Alle +/- werden nicht abgeschnitten. Wenn Sie haben, werden xxx-yyy-24Sie bekommen --24. Sie können str_repleace(array('+','-'), '', $result)beide Zeichen löschen.
imclickingmaniac
4
@imclickingmaniac können Sie max(0,filter_var($str, FILTER_SANITIZE_NUMBER_INT))stattdessen einfach Arrays und String-Ersetzungen verwenden.
Eduard
2
Wenn Sie max () verwenden, wird auch das Minuszeichen in den Zeichenfolgen zurückgegeben. Hier ist hoffentlich strreplace () die Option. Danke für die Tipps.
Shiva Avula
26
abs((int) filter_var($str, FILTER_SANITIZE_NUMBER_INT));
MECU
300
preg_replace('/[^0-9]/', '', $string);

Das sollte besser machen! ...

Mahipalsinh Ravalji
quelle
10
Ich mag das, weil es einen String zurückgibt, kein Array wie die Beispiele mit preg_match_all, und ich mag es, weil ich nur Zahlen will, kein Pluszeichen oder Bindestrich, wie es das Beispiel filter_var tut.
Darrell Duane
43
Seien Sie vorsichtig mit dieser Methode: so etwas wie 'In My Car_Price: 500.00wird gedruckt:50000
ErickBest
16
@ErickBest Das ist eine gute Sache, wenn man bedenkt, dass die Frage war extract the numbers from a string- ein Dezimalpunkt ist keine Zahl!
Rybo111
1
Dies ist ein Trottel, aber Sie möchten wahrscheinlich einfache Anführungszeichen 'und keine doppelten Anführungszeichen verwenden ".
CommandZ
16
preg_replace ('/ [^ 0-9.] /', '', 'abc1.22'); // gibt Dezimalzahl 1,22 zurück
zzapper
84

Verwenden von preg_replace:

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

Ausgabe: 1111111111

Akash Deep
quelle
4
Es funktioniert großartig. Es konvertiert +387 (61) 634-783String in 38761634783direkt. Sie müssen sich nicht um Arrays wie Gauravs Antwort kümmern.
Beytarovski
1
Auf jeden Fall die beste Antwort. sandbox.onlinephpfunctions.com/code/…
Steffan
Ich empfehle den +Quantifizierer für längere Übereinstimmungen / weniger Ersetzungen.
mickmackusa
21

Für schwebende Zahlen

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

Vielen Dank, dass Sie auf den Fehler hingewiesen haben. @ Mickmackusa

Yash
quelle
Es ist eigentlich falsch :) Es sollte sein'!\d*.?\d+!'
Yash
Ich würde es vorziehen, ?als Quantifizierer des wörtlichen Punktes zu verwenden. Ich würde nicht erwarten, dass ein Gleitkommawert mehrere Dezimalpunktsymbole enthält. Yashs kommentiertes Muster ist ironischerweise falsch . Der Punkt benötigt einen Schrägstrich, um ihn wörtlich zu machen.
Mickmackusa
11

Ich besitze das Guthaben dafür nicht, aber ich muss es nur teilen. Dieser reguläre Ausdruck erhält Zahlen aus einer Zeichenfolge, einschließlich Dezimalstellen / Stellen sowie Kommas:

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

Zitiert von hier:
php - regex - wie extrahiere ich eine Zahl mit Dezimalstelle (Punkt und Komma) aus einer Zeichenfolge (z. B. 1.120,01)?

mroncetwice
quelle
Dies überprüft die Zeichenfolge nicht für ein Komma zwischen Sätzen von drei ganzen Zahlen. ... das Problem, das Muster eines anderen zu kopieren und nicht zu verstehen / zu testen.
Mickmackusa
9

Sie können preg_match verwenden :

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

Verwenden von preg_replace

$str = 'In My Cart : 11 12 items';
$str = preg_replace('/\D/', '', $str);
echo $str;
Hariadi
quelle
Ich empfehle den +Quantifizierer für längere Übereinstimmungen / weniger Ersetzungen.
Mickmackusa
6

Sie können folgende Funktion verwenden:

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

   return $match[0];
}
Jasmeen
quelle
Das Schreiben \dinnerhalb einer Zeichenklasse hat keinen Vorteil . Da Sie auf das Fullstring-Match zugreifen, macht es keinen Sinn, eine Erfassungsgruppe in das Muster zu schreiben.
Mickmackusa
4
preg_match_all('!\d+!', $some_string, $matches);
$string_of_numbers = implode(' ', $matches[0]);

Das erste implodierende Argument in diesem speziellen Fall lautet "Trenne jedes Element in Übereinstimmungen [0] mit einem einzelnen Leerzeichen." Implode setzt kein Leerzeichen (oder was auch immer Ihr erstes Argument ist) vor die erste Zahl oder nach die letzte Zahl.

Zu beachten ist außerdem, dass in $ match [0] das gefundene Array von Übereinstimmungen (die mit diesem regulären Ausdruck übereinstimmen) gespeichert wird.

Weitere Erläuterungen zu den anderen Indizes im Array finden Sie unter: http://php.net/manual/en/function.preg-match-all.php

Bradley Kovacs
quelle
4

Versuchen Sie dies, verwenden Sie preg_replace

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

DEMO

Dave
quelle
[^0-9]ist einfacher geschrieben als \D.
Mickmackusa
3
$value = '25%';

Oder

$value = '25.025$';

Oder

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

Dies gibt nur den numerischen Wert zurück

Rakesh
quelle
3

Befolgen Sie diesen Schritt, um die Zeichenfolge in eine Zahl umzuwandeln

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

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

Ein anderer Weg, es zu tun:

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

anders (gerade Unicode-Zeichenfolge):

$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
quelle
0

Dieses Skript erstellt zunächst eine Datei, schreibt Zahlen in eine Zeile und wechselt in eine nächste Zeile, wenn ein anderes Zeichen als die Zahl angezeigt wird. Zum Schluss werden die Zahlen wieder zu einer Liste sortiert.

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
quelle
-1

Abhängig von Ihrem Anwendungsfall kann dies auch eine Option sein:

$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

Obwohl ich einer Regex zustimmen filter_var()würde oder im angegebenen Fall nützlicher wäre.

Kasimir
quelle
-1

für 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
quelle
-1

Wenn Sie nicht wissen, welches Format die Nummer hat? int oder float, dann benutze dies:

$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
quelle
-1

Diese Funktionen verarbeiten auch die schwebenden Zahlen

$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
quelle
Das Einfügen von Bindestrichen in diesen Prozess ist völlig unnötig. Dieser Antwort fehlt auch eine Erklärung, wie es funktioniert und warum Sie es für eine gute Idee halten.
Mickmackusa