2009-06-03 15 views
8

Ich möchte eine Zeichenfolge in Floating-Zahlen konvertieren. Zum BeispielExtrahieren Sie Gleitkommazahlen aus einer Zeichenfolge in PHP

152.15 x 12.34 x 11mm 

in

152.15, 12.34 and 11 

und Speicher in einem Array, so dass $ dim [0] = 152.15, $ dim [1] = 12.34, dim $ [2] = 11.

Ich würde auch Dinge behandeln müssen wie

152.15x12.34x11 mm 

152.15mmx12.34mm x 11mm 

Danke.

Antwort

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

Die (?:...) regulären Ausdruck Konstruktion ist es, was ein non-capturing group genannt wird. Was das bedeutet ist, dass Chunk nicht separat in einem Teil des $mathces Array zurückgegeben wird. Dies ist nicht unbedingt notwendig in diesem Fall ist aber eine nützliche Konstruktion zu wissen.

Hinweis: Aufruf floatval() auf den Elementen ist nicht unbedingt notwendig, entweder als PHP jonglieren im Allgemeinen der Typen richtig, wenn man sich in einer arithmetischen Operation oder ähnlichem versuchen und verwenden. Es tut aber nicht weh, besonders wenn man nur ein Liner ist.

+0

Sie können die äußeren Klammern entfernen, und dann $ Übereinstimmungen [0] enthält die Übereinstimmungen. Was ist auch der Zweck von '?:'? – troelskn

+1

Sie haben recht mit den äußeren Klammern. Das geändert. ?: macht, was innerhalb dieser Klammern als eine nicht-einfangende Gruppe ist, was bedeutet, dass es nicht separat irgendwo in das $ match-Array eingefügt wird, was es wäre, wenn Sie es nicht einschließen würden. Nicht unbedingt notwendig, aber sauberer und in komplizierteren Beispielen kann notwendig sein. – cletus

+0

@cletus: Sie haben absolut Recht mit der nicht-einfangenden Klammer, aber es macht die Regex viel weniger lesbar imo. Ich "bekomme" Paolos Regex viel schneller als deine. – soulmerge

1
$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 alle oben genannten Zeichenfolgen.

2
$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) 
4
<?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 
) 
+0

Warum nicht $ dim = $ stimmt mit [0] überein? – soulmerge

+0

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

+0

Gut eins, +1 für mich –

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

Dieses Beispiel unterstützt Zahlen wie .11 als auch, da sie gültige Zahlen sind. $matches[0] wird 152,15, 12.34 und 0,11, da enthalten, dass Sie das Ergebnis zu schweben Typ gegossen. Wenn Sie nicht 0,111 erscheint als .11. Ich würde Cast mit array_map eingeben.

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

Sie können die Werte für alles Mathe verwenden, ohne sie zu typisieren. Gießen wird nur benötigt, wenn sie direkt gedruckt werden.

+0

Ihr Beispiel wäre klarer, wenn Sie die Beispieldaten aus der Frage verwendet hätten. –

+0

Dies sollte es klarer machen. – runfalk

Verwandte Themen