397 Stimmen

Extrahieren einer einzelnen (vorzeichenlosen) Ganzzahl aus einer Zeichenkette

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

"In My Cart : 11 items"

Ich möchte die Nummer extrahieren 11 .

7voto

mickmackusa Punkte 36793

Da es nur 1 numerischen Wert in Ihrer Zeichenfolge zu isolieren ist, würde ich befürworten und persönlich verwenden filter_var() con FILTER_SANITIZE_NUMBER_INT .

echo filter_var($string, FILTER_SANITIZE_NUMBER_INT);

Eine verrücktere Technik, die funktioniert, weil es nur einen numerischen Wert gibt UND die einzigen Zeichen, die vor der Ganzzahl stehen, Buchstaben, Doppelpunkte oder Leerzeichen sind, ist die Verwendung von ltrim() mit einer Zeichenmaske und wandeln die verbleibende Zeichenkette in eine Ganzzahl um.

Demo

$string = "In My Cart : 11 items";
echo (int)ltrim($string, 'A..z: ');
// 11

Wenn es aus irgendeinem Grund mehr als einen Integer-Wert gäbe und Sie den ersten abgreifen wollten, dann wäre Regex eine direkte Technik.

Demo

echo preg_match('/\d+/', $string, $m) ? $m[0] : '';

sscanf() ist recht praktisch, wenn Sie die numerische Zeichenkette explizit als Ganzzahl (oder Fließkommazahl) umwandeln müssen. Wenn es möglich/unbekannt ist, dass der Integer-Wert am Anfang der Zeichenkette steht, dann stellen Sie der Eingabezeichenkette ein nicht-numerisches Zeichen voran, bevor Sie sie scannen. Die folgende Technik passt auf führende Nicht-Ziffern (und ignoriert sie mit * nach dem % ), stimmt dann mit der ersten vorkommenden Ziffernfolge überein und wandelt die zurückgegebene Teilfolge in eine Ganzzahl um.

Demo

var_dump(sscanf(' ' . $string, '%*[^0-9]%d')[0]);

Um diese Technik anzupassen, um einen Float-Wert zu extrahieren, ändern Sie einfach die d a f . Für weitere Informationen über die (derzeit nicht dokumentierte) Funktion zur Unterdrückung von Zuweisungen in sscanf() siehe diese Stelle .

6voto

Jasmeen Punkte 846

Sie können folgende Funktion verwenden:

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

   return $match[0];
}

5voto

Bradley Kovacs Punkte 94
preg_match_all('!\d+!', $some_string, $matches);
$string_of_numbers = implode(' ', $matches[0]);

Das erste Argument in implode besagt in diesem speziellen Fall: "Trenne jedes Element in matches[0] mit einem einzelnen Leerzeichen". Implode setzt kein Leerzeichen (oder was immer Ihr erstes Argument ist) vor die erste Zahl oder nach die letzte Zahl.

Zu beachten ist auch, dass in $matches[0] das Array der gefundenen Übereinstimmungen (die mit diesem regulären Ausdruck übereinstimmen) gespeichert wird.

Für weitere Informationen über die Bedeutung der anderen Indizes im Array siehe: http://php.net/manual/en/function.preg-match-all.php

4voto

Dave Punkte 3046

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

3voto

user889030 Punkte 3543

Können wir int daraus extrahieren wie

$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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X