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.


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

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

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


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


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


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


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

Verwenden von preg_replace

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

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

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


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


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



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

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 ) 

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)

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


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

-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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.