2009-06-03 9 views

Répondre

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

La construction d'expression régulière (?:...) est ce qu'on appelle un non-capturing group. Cela signifie que ce segment n'est pas renvoyé séparément dans une partie du tableau $mathces. Ce n'est pas strictement nécessaire dans ce cas mais est une construction utile à connaître.

Note: appelant floatval() sur les éléments est pas strictement nécessaire soit correctement si vous essayez de les utiliser dans une opération arithmétique ou similaire que PHP va jongler avec généralement les types. Il ne fait pas mal, en particulier pour être un seul paquebot.

+0

Vous pouvez ignorer les parenthèses externes, puis $ matches [0] contiendra les correspondances. Aussi, quel est le but de '?:'? – troelskn

+1

Vous avez raison sur les parenthèses externes. Changé ça. ?: fait ce qui est à l'intérieur de ces parenthèses comme un groupe non-capturant, signifiant qu'il ne sera pas mis séparément dans le tableau $ matches, ce qui serait le cas si vous ne l'incluiez pas. Pas strictement nécessaire mais plus propre et dans des exemples plus compliqués peut être nécessaire. – cletus

+0

@cletus: Vous avez absolument raison quant à la parenthèse non-capturante, mais cela rend l'expression rationnelle moins lisible. J'obtiens l'expression rationnelle de Paolo beaucoup plus vite que la tienne. – 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) 

Testé et fonctionne sur toutes les chaînes ci-dessus.

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

?> 

donne

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

Pourquoi pas $ dim = $ correspond [0]? – soulmerge

+0

c'est vrai ... corrigé. Au début, j'imprimais chaque valeur. si $ dim a déjà des valeurs, nous utilisons une boucle ou array_merge() –

+0

Bon, +1 pour moi –

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

Cet exemple prend en charge les numéros comme .11 ainsi, car ils sont valables. $matches[0] contiendra 152,15, 12,34 et 0,11, étant donné que vous tapez cast le résultat à flotter. Si vous ne 0.11 apparaîtra comme .11. Je tape cast en utilisant array_map.

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

Vous pouvez utiliser les valeurs pour tout type de maths sans les transtyper. le moulage est juste nécessaire en les imprimant directement.

+0

Votre exemple serait plus clair si vous utilisiez les exemples de données de la question. –

+0

Cela devrait le rendre plus clair. – runfalk

Questions connexes