Extrahieren Sie Gleitkommazahlen aus einer Zeichenfolge mit Trennzeichen in PHP

Lesezeit: 3 Minuten

Benutzer-Avatar
Tian Bo

Ich möchte eine Zeichenfolge mit getrennten Dimensionswerten in Gleitkommazahlen umwandeln.

Zum Beispiel

152.15 x 12.34 x 11mm

hinein

152.15, 12.34 and 11

und in einem Array speichern, so dass:

$dim[0] = 152.15;
$dim[1] = 12.34;
$dim[2] = 11;

Ich müsste auch Szenarien behandeln, in denen der Begrenzungstext unterschiedlich ist und auf die Zahlen ein Einheitsausdruck folgen kann wie:

152.15x12.34x11 mm

152.15mmx12.34mm x 11mm

Benutzer-Avatar
Cletus

$str="152.15 x 12.34 x 11mm";
preg_match_all('!\d+(?:\.\d+)?!', $str, $matches);
$floats = array_map('floatval', $matches[0]);
print_r($floats);

Das (?:...) Die Konstruktion regulärer Ausdrücke ist das, was als a bezeichnet wird nicht einfangende Gruppe. Das bedeutet, dass Chunk in einem Teil von nicht separat zurückgegeben wird $mathces Reihe. Dies ist nicht unbedingt erforderlich in diesem Fall aber es ist eine nützliche Konstruktion zu wissen.

Notiz: Berufung floatval() auf den Elementen ist auch nicht unbedingt erforderlich, da PHP die Typen im Allgemeinen korrekt jonglieren wird, wenn Sie versuchen, sie in einer arithmetischen Operation oder ähnlichem zu verwenden. Es tut aber nicht weh, besonders weil es nur ein Einzeiler ist.

  • Sie können die äußeren Klammern weglassen und dann $matches[0] enthält die Streichhölzer. Auch, was ist der Zweck von ?: ?

    – troelskn

    3. Juni 2009 um 12:22 Uhr

  • Mit den äußeren Klammern hast du recht. Habe das geändert. ?: macht das, was in diesen Klammern steht, zu einer nicht erfassenden Gruppe, was bedeutet, dass es nirgendwo separat in das $matches-Array eingefügt wird, was es wäre, wenn Sie es nicht einschließen würden. Nicht unbedingt erforderlich, aber sauberer und in komplizierteren Beispielen möglicherweise erforderlich.

    – Kletus

    3. Juni 2009 um 12:24 Uhr

  • @cletus: Sie haben absolut Recht mit der nicht erfassenden Klammer, aber sie macht die Regex imo viel weniger lesbar. Ich “verstehe” Paolos Regex viel schneller als deine.

    – Seelenverschmelzung

    3. Juni 2009 um 12:43 Uhr

  • Nun, schauen Sie auf die positive Seite: Sie haben etwas extra gelernt. 🙂 Nicht einfangende Gruppen sind nützlich.

    – Kletus

    3. Juni 2009 um 12:44 Uhr

  • Außerdem habe ich meine gelesen und es ist klar, dass ich nicht daran interessiert bin, Teile der Nummer separat zu erfassen, sondern nur die ganze Nummer. Das Obige entspricht eindeutig Ihrer Absicht, die Sie meiner Meinung nach anstreben sollten.

    – Kletus

    3. Juni 2009 um 12:47 Uhr

Benutzer-Avatar
Nichtpolarität

<?php

$s = "152.15 x 12.34 x 11mm";

if (preg_match_all('/\d+(\.\d+)?/', $s, $matches)) {
    $dim = $matches[0];
}

print_r($dim);

?>

gibt

Array
(
    [0] => 152.15
    [1] => 12.34
    [2] => 11
)

  • das ist wahr … korrigiert. Zuerst druckte ich jeden Wert aus. Wenn $dim bereits einige Werte hat, verwenden wir entweder eine Schleife oder array_merge()

    – Nichtpolarität

    3. Juni 2009 um 12:53 Uhr

  • Diese Antwort täuscht. Die ausgegebenen Array-Werte sind Zeichenfolgen, keine Gleitkommazahlen.

    – mickmackusa

    4. Mai um 13:03 Uhr

$string = '152.15 x 12.34 x 11mm';
preg_match_all('/(\d+(\.\d+)?)/', $string, $matches);
print_r($matches[0]); // Array ( [0] => 152.15 [1] => 12.34 [2] => 11 ) 

  • Diese Antwort täuscht. Die ausgegebenen Array-Werte sind Zeichenfolgen, keine Gleitkommazahlen.

    – mickmackusa

    4. Mai um 13:03 Uhr

$str = "152.15 x 12.34 x 11mm";
$str = str_replace("mm", "", $str);
$str = explode("x", $str);
print_r($str); // Array ( [0] => 152.15 [1] => 12.34 [2] => 11 ) 

Getestet und es funktioniert auf allen Saiten oben.

Verwenden sscanf() bietet das gleiche Maß an erforderlicher Flexibilität wie a preg_ Funktionsaufruf, aber sscanf() ist besser, weil es Ihnen ermöglicht, die Zielwerte explizit als Gleitkommazahlen von ihr umzuwandeln format Parameter.

%f bedeutet eine Float-Zahl-Teilzeichenfolge und %*[mx ] passt und ignoriert die unerwünschten Trennzeichen stillschweigend.

Jetzt brauchen Sie nicht mehr anzurufen floatval() innerhalb array_map() um die Float-Werte zu werfen.

Code: (Demo)

var_dump(
    sscanf($test, '%f%*[mx ]%f%*[mx ]%f')
);

Ausgabe:

array(3) {
  [0]=>
  float(152.15)
  [1]=>
  float(12.34)
  [2]=>
  float(11)
}

preg_match_all("/\d*\.?\d+|\d+/", "152.15mmx12.34mm x .11mm", $matches);

Dieses Beispiel unterstützt Zahlen wie .11 auch, da es sich um gültige Zahlen handelt. $matches[0] wird beinhalten 152.15, 12.34 und 0,11, vorausgesetzt, Sie geben das Ergebnis in Float um. Wenn nicht 0,11 erscheint als .11. Ich würde cast using eingeben array_map.

$values = array_map("floatval", $matches[0]); 

Sie können die Werte jedoch für beliebige mathematische Zwecke verwenden, ohne sie umzuwandeln. Gießen ist nur erforderlich, wenn sie direkt gedruckt werden.

1011930cookie-checkExtrahieren Sie Gleitkommazahlen aus einer Zeichenfolge mit Trennzeichen in PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy